perm filename TEX.PAS[WEB,ALS] blob sn#673726 filedate 1982-08-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00042 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00005 00002	{4}{9}{$C-,A+,D-,W+}{$C+,D+,W+}
C00021 00003	PROCEDURE Initialize
C00034 00004	{56}PROCEDURE Println
C00048 00005	{28}PROCEDURE Aclose(VAR f:alphafile)
C00065 00006	{109}PROCEDURE Printmemoryw(w:memoryword)
C00076 00007	{146}FUNCTION Newparamglue(n:smallnumber):halfword
C00087 00008	{217}PROCEDURE Printskippar(n:integer)
C00105 00009	{205}PROCEDURE Printmode(m:integer)
C00116 00010	{257}PROCEDURE Newsavelevel(c:groupcode)
C00132 00011	{290}PROCEDURE Showcontext
C00154 00012	{338}PROCEDURE Firmupthelin
C00168 00013	{370}FUNCTION Scankeyword(s:strnumber):boolean
C00183 00014	{403}PROCEDURE Scandimen(mu,inf,shortcut:boolean)
C00201 00015	{434}PROCEDURE Beginname
C00214 00016	{477}PROCEDURE Readfontinfo(u:userfontcode
C00228 00017	{498}PROCEDURE Charwarning(f:internalfont
C00251 00018	{542}PROCEDURE Vlistout
C00259 00019	{551}PROCEDURE Shipout(p:halfword)
C00277 00020	{602}PROCEDURE Showinfo
C00294 00021	{643}PROCEDURE Makefraction(q:halfword)
C00319 00022	{672}PROCEDURE Pushalignmen
C00331 00023	{698}PROCEDURE Doassignment
C00360 00024	{771}PROCEDURE Postlinebrea(finalwidowpe:integer)
C00374 00025	PROCEDURE Linebreak(finalwidowpe:integer)
C00390 00026	{827}PROCEDURE Newhyphexcep
C00413 00027	{882}PROCEDURE Buildpage
C00430 00028	{915}{919}PROCEDURE Missingfont
C00440 00029	{968}PROCEDURE Beginbox
C00450 00030	{999}PROCEDURE Unpackage
C00460 00031	{1027}PROCEDURE Initmath
C00471 00032	{1054}PROCEDURE Mathac
C00485 00033	{1084}PROCEDURE Resumeafterd
C00509 00034	{1155}PROCEDURE Doassignment
C00517 00035	{1181}PROCEDURE Storefmtfile
C00531 00036	{1227}{1228}PROCEDURE Newwhatsit(s:smallnumber
C00540 00037	PROCEDURE Maincontrol
C00554 00038	{1182}{443}FUNCTION Openfmtfile:boolean
C00556 00039	FUNCTION Loadfmtfile:boolean
C00570 00040	{1208}{1212}PROCEDURE Closefilesan
C00578 00041	{1214}PROCEDURE Finalcleanup
C00590 00042	{1217}PROCEDURE Debughelp
C00596 ENDMK
C⊗;
{4}{9}{$C-,A+,D-,W+}{$C+,D+,W+}
PROGRAM Tex;
LABEL
    {6}1,9998,9999;
CONST
    {11}memmax=20000;
    bufsize=500;
    errorline=64;
    halferrorlin=32;
    maxprintline=72;
    stacksize=80;
    maxinopen=6;
    fontmax=75;
    badfontcode=300;
    fontmemsize=15000;
    paramsize=30;
    nestsize=40;
    maxstrings=3000;
    stringvacanc=8000;
    poolsize=31000;
    alignsize=4;
    savesize=300;
    triesize=7000;
    dvibufsize=800;
    filenamesize=23;
    poolname='TEX.POOL               ';
TYPE
    {18}asciicode=0..127;
    {25}eightbits=0..255;
    alphafile=PACKED FILE OF char;
    bytefile=PACKED FILE OF eightbits;
    {38}poolpointer=0..poolsize;
    strnumber=0..maxstrings;
    {96}scaled=integer;
    nonnegativei=0..2147483647;
    smallnumber=0..63;
    {104}glueratio=real;
    {108}quarterword=0..255;
    halfword=0..65535;
    twochoices=1..2;
    fourchoices=1..4;
    twohalves=PACKED RECORD rh:halfword;
			 CASE twochoices OF 1:(lh:halfword);
			      2:(b0:quarterword;
				 b1:quarterword);
		     END;
    fourquarters=PACKED RECORD b0:quarterword;
			    b1:quarterword;
			    b2:quarterword;
			    b3:quarterword;
			END;
    memoryword=PACKED RECORD CASE fourchoices OF 1:(int:integer);
				  2:(gr:glueratio);
				  3:(hh:twohalves);
				  4:(qqqq:fourquarters);
		      END;
    wordfile=FILE OF memoryword;
    {144}glueord=0..3;
    {206}liststaterec=RECORD modefield:-185..185;
			  headfield,tailfield:halfword;
			  alreadyfield,auxfield,mlfield:integer;
		      END;
    {252}groupcode=0..17;
    {279}instaterecor=RECORD statefield,indexfield:quarterword;
			  startfield,locfield,limitfield,namefield:halfword;
		      END;
    {467}userfontcode=0..badfontcode;
    internalfont=0..fontmax;
    {510}dviindex=0..dvibufsize;
    packedbytes=PACKED ARRAY[dviindex]OF eightbits;
    {814}triepointer=0..triesize;
    {819}hyphpointer=0..307;
VAR
    {13}bad:integer;
    {20}xord:ARRAY[char]OF asciicode;
    xchr:ARRAY[asciicode]OF char;
    {26}nameoffile:PACKED ARRAY[1..filenamesize]OF char;
    namelength:0..filenamesize;
    {30}buffer:ARRAY[0..bufsize]OF asciicode;
    first:0..bufsize;
    last:0..bufsize;
    maxbufstack:0..bufsize;
    auxbuf:ARRAY[0..70]OF char;
    {32}termin:alphafile;
    termout:alphafile;
    {39}strpool:PACKED ARRAY[poolpointer]OF asciicode;
    strstart:ARRAY[strnumber]OF poolpointer;
    poolptr:poolpointer;
    strptr:strnumber;
    {50}poolfile:alphafile;
    {54}logfile:alphafile;
    selector:0..21;
    dig:ARRAY[0..22]OF 0..9;
    tally:integer;
    termoffset:0..maxprintline;
    fileoffset:0..maxprintline;
    trickbuf:ARRAY[0..errorline]OF asciicode;
    trickcount:integer;
    firstcount:integer;
    {70}interaction:0..3;
    {73}deletionsall:boolean;
    spotless:boolean;
    errorcount:-1..100;
    {76}helpline:ARRAY[0..5]OF strnumber;
    helpptr:0..6;
    {91}interrupt:integer;
    oktointerrup:boolean;
    {99}aritherror:boolean;
    remainder:scaled;
    {110}tempptr:halfword;
    {111}mem:ARRAY[0..memmax]OF memoryword;
    {112}varused,dynused:integer;
    maxvarused:integer;
    {113}avail:halfword;
    memend:halfword;
    {118}rover:halfword;
    {159}free:PACKED ARRAY[0..memmax]OF boolean;
    wasfree:PACKED ARRAY[0..memmax]OF boolean;
    wasmemend:halfword;
    panicking:boolean;
    {167}fontinshortd:integer;
    {175}depththresho:integer;
    breadthmax:integer;
    {207}nest:ARRAY[0..nestsize]OF liststaterec;
    nestptr:0..nestsize;
    maxneststack:0..nestsize;
    curlist:liststaterec;
    shownmode:-185..185;
    {231}oldsetting:0..21;
    {236}eqtb:ARRAY[1..4279]OF memoryword;
    xeqlevel:ARRAY[3584..4279]OF quarterword;
    {239}hash:ARRAY[257..2360]OF twohalves;
    hashused:halfword;
    nonewcontrol:boolean;
    csptr:halfword;
    cscount:integer;
    {254}savestack:ARRAY[0..savesize]OF memoryword;
    saveptr:0..savesize;
    maxsavestack:0..savesize;
    curlevel:quarterword;
    curgroup:groupcode;
    curboundary:0..savesize;
    {267}magset:integer;
    {277}curcmd:eightbits;
    curchr:halfword;
    curtok:halfword;
    {280}inputstack:ARRAY[0..stacksize]OF instaterecor;
    inputptr:0..stacksize;
    maxinstack:0..stacksize;
    curinput:instaterecor;
    {283}inopen:0..maxinopen;
    inputfile:ARRAY[1..maxinopen]OF alphafile;
    line:integer;
    linestack:ARRAY[0..maxinopen]OF integer;
    page:integer;
    pagestack:ARRAY[0..maxinopen]OF integer;
    {284}scannerstatu:0..4;
    warningindex:halfword;
    defref:halfword;
    {287}paramstack:ARRAY[0..paramsize]OF halfword;
    paramptr:0..paramsize;
    maxparamstac:integer;
    {288}alignstate:integer;
    {289}baseptr:0..stacksize;
    {311}parloc:halfword;
    partoken:halfword;
    {344}curmark:ARRAY[0..4]OF halfword;
    {349}longstate:94..97;
    {350}pstack:ARRAY[0..8]OF halfword;
    {372}curval:integer;
    curvallevel:0..4;
    {394}radix:smallnumber;
    {402}curorder:glueord;
    {431}curname:strnumber;
    curarea:strnumber;
    curext:strnumber;
    {432}areadelimite:poolpointer;
    extdelimiter:poolpointer;
    {439}texformatdef:PACKED ARRAY[1..18]OF char;
    {447}jobname:strnumber;
    {452}dvifile:bytefile;
    outputfilena:strnumber;
    {458}tfmfile:bytefile;
    {468}fontinfo:ARRAY[0..fontmemsize]OF memoryword;
    fmemptr:0..fontmemsize;
    fontptr:internalfont;
    fontcode:ARRAY[internalfont]OF userfontcode;
    fontnumber:ARRAY[userfontcode]OF internalfont;
    fontcheck:ARRAY[internalfont]OF fourquarters;
    fontsize:ARRAY[internalfont]OF scaled;
    fontdsize:ARRAY[internalfont]OF scaled;
    fontparams:ARRAY[internalfont]OF halfword;
    fontname:ARRAY[internalfont]OF strnumber;
    fontarea:ARRAY[internalfont]OF strnumber;
    fontbc:ARRAY[internalfont]OF eightbits;
    fontec:ARRAY[internalfont]OF eightbits;
    fontglue:ARRAY[internalfont]OF halfword;
    fontused:ARRAY[internalfont]OF boolean;
    {469}charbase:ARRAY[internalfont]OF integer;
    widthbase:ARRAY[internalfont]OF integer;
    heightbase:ARRAY[internalfont]OF integer;
    depthbase:ARRAY[internalfont]OF integer;
    italicbase:ARRAY[internalfont]OF integer;
    ligkernbase:ARRAY[internalfont]OF integer;
    kernbase:ARRAY[internalfont]OF integer;
    extenbase:ARRAY[internalfont]OF integer;
    parambase:ARRAY[internalfont]OF integer;
    {472}nullcharacte:fourquarters;
    {508}totalpages:integer;
    maxv:scaled;
    maxh:scaled;
    maxpush:integer;
    lastbop:integer;
    deadcycles:integer;
    doingleaders:boolean;
    c,f:quarterword;
    hd:quarterword;
    ruleht,ruledp,rulewd:scaled;
    g:halfword;
    lq,lr,lx:integer;
    {511}dvibuf:packedbytes;
    halfbuf:dviindex;
    dvilimit:dviindex;
    dviptr:dviindex;
    dvioffset:integer;
    dvigone:integer;
    {518}downptr,rightptr:halfword;
    {529}dvih,dviv:scaled;
    curh,curv:scaled;
    dvif:internalfont;
    curs:integer;
    {559}totalstretch,totalshrink:ARRAY[glueord]OF scaled;
    {572}parbeginline:integer;
    {594}emptyfield:twohalves;
    {625}curmlist:halfword;
    curstyle:smallnumber;
    cursize:smallnumber;
    curmu:scaled;
    mlistpenalti:boolean;
    {629}curf:internalfont;
    curc:quarterword;
    curi:fourquarters;
    {664}magicoffset:integer;
    {670}curalign:halfword;
    curspan:halfword;
    alignptr:halfword;
    {709}justbox:halfword;
    {716}passive:halfword;
    printhead:halfword;
    {718}activewidth:ARRAY[1..6]OF scaled;
    curactivewid:ARRAY[1..6]OF scaled;
    background:ARRAY[1..6]OF scaled;
    breakwidth:ARRAY[1..6]OF scaled;
    {720}noshrinkerro:boolean;
    {723}curp:halfword;
    secondpass:boolean;
    threshold:integer;
    {728}minimaldemer:ARRAY[0..3]OF scaled;
    minimumdemer:scaled;
    bestplace:ARRAY[0..3]OF halfword;
    bestplline:ARRAY[0..3]OF halfword;
    {734}discwidth:scaled;
    {742}easyline:halfword;
    lastspeciall:halfword;
    firstwidth:scaled;
    secondwidth:scaled;
    firstindent:scaled;
    secondindent:scaled;
    {766}bestbet:halfword;
    fewestdemeri:integer;
    bestline:halfword;
    actualloosen:integer;
    linediff:integer;
    {786}hc:ARRAY[0..65]OF halfword;
    hn:smallnumber;
    ha,hb:halfword;
    hf:internalfont;
    hu:ARRAY[1..63]OF asciicode;
    {794}hyf:ARRAY[0..64]OF 0..9;
    {799}hyphenpassed:smallnumber;
    {815}trie:ARRAY[triepointer]OF twohalves;
    hyfdistance:ARRAY[quarterword]OF smallnumber;
    hyfnum:ARRAY[quarterword]OF smallnumber;
    hyfnext:ARRAY[quarterword]OF quarterword;
    {820}hyphword:ARRAY[hyphpointer]OF strnumber;
    hyphlist:ARRAY[hyphpointer]OF halfword;
    hyphcount:hyphpointer;
    {836}trieophash:ARRAY[0..510]OF quarterword;
    trieopptr:quarterword;
    {838}triec:ARRAY[triepointer]OF asciicode;
    trieo:ARRAY[triepointer]OF quarterword;
    triel:ARRAY[triepointer]OF triepointer;
    trier:ARRAY[triepointer]OF triepointer;
    trieptr:triepointer;
    {839}triehash:ARRAY[triepointer]OF triepointer;
    {843}trietaken:ARRAY[triepointer]OF boolean;
    triemax:triepointer;
    triemin:triepointer;
    {864}bestheightpl:scaled;
    {873}pagetail:halfword;
    pagecontents:0..2;
    pagesize:scaled;
    pagedepthmax:scaled;
    bestpagebrea:halfword;
    leastpagebad:integer;
    bestsize:scaled;
    {875}pagesofar:ARRAY[1..6]OF scaled;
    curpagedepth:scaled;
    lastpageglue:halfword;
    inspenalties:integer;
    {879}outputactive:boolean;
    {963}curbox:halfword;
    {1161}errhelpseen:boolean;
    {1178}formatident:strnumber;
    {1184}fmtfile:wordfile;
    {1209}readyalready:integer;
    {1221}sendfile:ARRAY[0..15]OF alphafile;
    sendopen:ARRAY[0..15]OF boolean;
    {1224}sendloc:halfword;
    {1253}pseudotypein:strnumber;

PROCEDURE Initialize;
    VAR
	{19}i:0..127;
	{157}k:integer;
	{821}z:hyphpointer;
    BEGIN{8}{21}
    xchr[32]:=' ';
    xchr[33]:='!';
    xchr[34]:='"';
    xchr[35]:='#';
    xchr[36]:='$';
    xchr[37]:='%';
    xchr[38]:='&';
    xchr[39]:='''';
    xchr[40]:='(';
    xchr[41]:=')';
    xchr[42]:='*';
    xchr[43]:='+';
    xchr[44]:=',';
    xchr[45]:='-';
    xchr[46]:='.';
    xchr[47]:='/';
    xchr[48]:='0';
    xchr[49]:='1';
    xchr[50]:='2';
    xchr[51]:='3';
    xchr[52]:='4';
    xchr[53]:='5';
    xchr[54]:='6';
    xchr[55]:='7';
    xchr[56]:='8';
    xchr[57]:='9';
    xchr[58]:=':';
    xchr[59]:=';';
    xchr[60]:='<';
    xchr[61]:='=';
    xchr[62]:='>';
    xchr[63]:='?';
    xchr[64]:='@';
    xchr[65]:='A';
    xchr[66]:='B';
    xchr[67]:='C';
    xchr[68]:='D';
    xchr[69]:='E';
    xchr[70]:='F';
    xchr[71]:='G';
    xchr[72]:='H';
    xchr[73]:='I';
    xchr[74]:='J';
    xchr[75]:='K';
    xchr[76]:='L';
    xchr[77]:='M';
    xchr[78]:='N';
    xchr[79]:='O';
    xchr[80]:='P';
    xchr[81]:='Q';
    xchr[82]:='R';
    xchr[83]:='S';
    xchr[84]:='T';
    xchr[85]:='U';
    xchr[86]:='V';
    xchr[87]:='W';
    xchr[88]:='X';
    xchr[89]:='Y';
    xchr[90]:='Z';
    xchr[91]:='[';
    xchr[92]:='\';
    xchr[93]:=']';
    xchr[94]:='↑';
    xchr[95]:='_';
    xchr[96]:='`';
    xchr[97]:='a';
    xchr[98]:='b';
    xchr[99]:='c';
    xchr[100]:='d';
    xchr[101]:='e';
    xchr[102]:='f';
    xchr[103]:='g';
    xchr[104]:='h';
    xchr[105]:='i';
    xchr[106]:='j';
    xchr[107]:='k';
    xchr[108]:='l';
    xchr[109]:='m';
    xchr[110]:='n';
    xchr[111]:='o';
    xchr[112]:='p';
    xchr[113]:='q';
    xchr[114]:='r';
    xchr[115]:='s';
    xchr[116]:='t';
    xchr[117]:='u';
    xchr[118]:='v';
    xchr[119]:='w';
    xchr[120]:='x';
    xchr[121]:='y';
    xchr[122]:='z';
    xchr[123]:='{';
    xchr[124]:='|';
    xchr[125]:='}';
    xchr[126]:='~';
    xchr[0]:=' ';
    xchr[127]:=' ';
    {23} FOR i:=1 TO 31 DO xchr[i]:=Chr(i);
    xchr[24]:=Chr(95);
    xchr[26]:=Chr(27);
    xchr[27]:=Chr(126);
    {24}FOR i:=0 TO 127 DO xord[Chr(i)]:=127;
    FOR i:=1 TO 126 DO xord[xchr[i]]:=i;
    {71}interaction:=3;
    {74}deletionsall:=true;
    spotless:=true;
    errorcount:=0;
    {92}interrupt:=0;
    oktointerrup:=true;
    {160}wasmemend:=0;
    panicking:=false;
    {209}nestptr:=0;
    maxneststack:=0;
    curlist.modefield:=1;
    curlist.headfield:=10001;
    curlist.tailfield:=10001;
    curlist.auxfield:=-65536000;
    curlist.mlfield:=0;
    curlist.alreadyfield:=0;
    shownmode:=0;
    {881}pagecontents:=0;
    pagetail:=10002;
    mem[10002].hh.rh:=0;
    lastpageglue:=65535;
    inspenalties:=0;
    curpagedepth:=0;
    pagedepthmax:=0;;
    {237} FOR k:=3584 TO 4279 DO xeqlevel[k]:=1;
    {240}nonewcontrol:=true;
    hash[257].lh:=0;
    hash[257].rh:=0;
    FOR k:=258 TO 2360 DO hash[k]:=hash[257];
    {255}saveptr:=0;
    curlevel:=1;
    curgroup:=0;
    curboundary:=0;
    maxsavestack:=0;
    {268}magset:=0;
    {345}curmark[0]:=0;
    curmark[1]:=0;
    curmark[2]:=0;
    curmark[3]:=0;
    curmark[4]:=0;
    {440}texformatdef:='BASIC.fmt[tex,sys]';
    {470}FOR k:=0 TO badfontcode DO fontnumber[k]:=0;
    fontptr:=0;
    fmemptr:=7;
    fontcode[0]:=badfontcode;
    fontbc[0]:=1;
    fontec[0]:=0;
    fontglue[0]:=0;
    fontparams[0]:=7;
    parambase[0]:=-1;
    FOR k:=0 TO 6 DO fontinfo[k].int:=0;
    FOR k:=0 TO fontmax DO fontused[k]:=false;
    {473}nullcharacte.b0:=0;
    nullcharacte.b1:=0;
    nullcharacte.b2:=0;
    nullcharacte.b3:=0;
    {509}totalpages:=0;
    maxv:=0;
    maxh:=0;
    maxpush:=0;
    lastbop:=-1;
    doingleaders:=false;
    deadcycles:=0;
    {512}halfbuf:=dvibufsize DIV 2;
    dvilimit:=dvibufsize;
    dviptr:=0;
    dvioffset:=0;
    dvigone:=0;
    {519}downptr:=0;
    rightptr:=0;
    {573}parbeginline:=0;
    {595}emptyfield.rh:=0;
    emptyfield.lh:=0;
    {671}alignptr:=0;
    curalign:=0;
    curspan:=0;
    {822}FOR z:=0 TO 307 DO hyphword[z]:=0;
    hyphcount:=0;
    {880}outputactive:=false;
    {1162}errhelpseen:=false;
    {1179}formatident:=0;
    {1210}readyalready:=314159;
    {1222}FOR k:=0 TO 15 DO sendopen[k]:=false;
    {1254}pseudotypein:=0;
    page:=0;
    {158}FOR k:=1 TO 19 DO mem[k].int:=0;
    k:=0;
    WHILE k<20 DO
	BEGIN
	mem[k].hh.rh:=1;
	mem[k].hh.b0:=0;
	mem[k].hh.b1:=0;
	k:=k+4;
	END;
    mem[6].int:=65536;
    mem[4].hh.b0:=1;
    mem[10].int:=65536;
    mem[8].hh.b0:=2;
    mem[14].int:=65536;
    mem[12].hh.b0:=1;
    mem[15].int:=65536;
    mem[12].hh.b1:=1;
    mem[18].int:=-65536;
    mem[16].hh.b0:=1;
    rover:=20;
    mem[rover].hh.rh:=65535;
    mem[rover].hh.lh:=10000-rover;
    mem[rover+1].hh.lh:=rover;
    mem[rover+1].hh.rh:=rover;
    mem[10000].hh.rh:=0;
    mem[10000].hh.lh:=0;
    FOR k:=10001 TO 10011 DO mem[k]:=mem[10000];
    {689}mem[10010].hh.lh:=2304;
    {695}mem[10009].hh.rh:=256;
    mem[10009].hh.lh:=0;
    {715}mem[10006].hh.b0:=1;
    mem[10007].hh.lh:=65535;
    mem[10006].hh.b1:=0;
    {874}mem[10000].hh.b1:=255;
    mem[10000].hh.b0:=1;
    mem[10000].hh.rh:=10000;
    {878}mem[10002].hh.b0:=10;
    mem[10002].hh.b1:=0;;
    avail:=0;
    memend:=10011;
    varused:=20;
    dynused:=12;
    maxvarused:=varused;
    {215}eqtb[2361].hh.b0:=92;
    eqtb[2361].hh.rh:=0;
    eqtb[2361].hh.b1:=0;
    FOR k:=1 TO 2360 DO eqtb[k]:=eqtb[2361];
    {220}eqtb[2362].hh.rh:=0;
    eqtb[2362].hh.b1:=1;
    eqtb[2362].hh.b0:=98;
    FOR k:=2363 TO 2634 DO eqtb[k]:=eqtb[2362];
    mem[0].hh.rh:=mem[0].hh.rh+273;
    {223}eqtb[2635].hh.rh:=0;
    eqtb[2635].hh.b0:=99;
    eqtb[2635].hh.b1:=1;
    eqtb[2636]:=eqtb[2361];
    eqtb[2637]:=eqtb[2361];
    eqtb[2638].hh.rh:=0;
    eqtb[2638].hh.b0:=100;
    eqtb[2638].hh.b1:=1;
    FOR k:=2639 TO 2893 DO eqtb[k]:=eqtb[2638];
    eqtb[2894].hh.rh:=0;
    eqtb[2894].hh.b0:=101;
    eqtb[2894].hh.b1:=1;
    FOR k:=2895 TO 2942 DO eqtb[k]:=eqtb[2894];
    eqtb[2943].hh.rh:=0;
    eqtb[2943].hh.b0:=101;
    eqtb[2943].hh.b1:=1;
    FOR k:=2944 TO 3583 DO eqtb[k]:=eqtb[2943];
    FOR k:=0 TO 127 DO
	BEGIN
	eqtb[2944+k].hh.rh:=12;
	eqtb[3072+k].hh.rh:=k;
	eqtb[3456+k].hh.rh:=1000;
	END;
    eqtb[2957].hh.rh:=5;
    eqtb[2976].hh.rh:=10;
    eqtb[3036].hh.rh:=0;
    eqtb[2956].hh.rh:=5;
    eqtb[3071].hh.rh:=15;
    eqtb[2944].hh.rh:=9;
    FOR k:=65 TO 90 DO
	BEGIN
	eqtb[2944+k].hh.rh:=11;
	eqtb[2944+k+32].hh.rh:=11;
	eqtb[3072+k].hh.rh:=k+28928;
	eqtb[3072+k+32].hh.rh:=k+28960;
	eqtb[3200+k].hh.rh:=k+32;
	eqtb[3200+k+32].hh.rh:=k+32;
	eqtb[3328+k].hh.rh:=k;
	eqtb[3328+k+32].hh.rh:=k;
	eqtb[3456+k].hh.rh:=999;
	END;
    {228}FOR k:=3584 TO 3877 DO eqtb[k].int:=0;
    eqtb[3600].int:=1000;
    eqtb[3585].int:=10000;
    eqtb[3620].int:=25;
    FOR k:=0 TO 127 DO eqtb[3878+k].int:=-1;
    {235}
    FOR k:=4006 TO 4279 DO eqtb[k].int:=0;
    {241}hashused:=2357;
    cscount:=0;
    {845}trieopptr:=0;
    trie[0].rh:=0;
    trie[0].b1:=0;
    trie[0].b0:=0;
    FOR k:=1 TO 127 DO trie[k]:=trie[0];
    triemax:=127;
    {953}hash[2358].rh:=349;
    eqtb[2358].hh.b1:=1;
    eqtb[2358].hh.b0:=61;
    eqtb[2358].hh.rh:=0;
    hash[2359].rh:=630;
    eqtb[2359].hh.b1:=1;
    eqtb[2359].hh.b0:=47;
    eqtb[2359].hh.rh:=30;
    {1180}formatident:=1022;
    {1247}hash[2360].rh:=1058;
    eqtb[2360].hh.b1:=1;
    eqtb[2360].hh.b0:=96;
    eqtb[2360].hh.rh:=0;
    END;
{56}PROCEDURE Println;
    BEGIN
    CASE selector OF
	19:BEGIN
	    Writeln(termout);
	    Writeln(logfile);
	    termoffset:=0;
	    fileoffset:=0;
	    END;
	18:BEGIN
	    Writeln(logfile);
	    fileoffset:=0;
	    END;
	17:BEGIN
	    Writeln(termout);
	    termoffset:=0;
	    END;
	16,20,21:;
	OTHERS:Writeln(sendfile[selector])
	END;
    END;
    {57}
PROCEDURE Printchar(c:asciicode);
    BEGIN
    CASE selector OF
	19:BEGIN
	    Write(termout,xchr[c]);
	    Write(logfile,xchr[c]);
	    termoffset:=termoffset+1;
	    fileoffset:=fileoffset+1;
	    IF termoffset=maxprintline THEN
		BEGIN
		Writeln(termout);
		termoffset:=0;
		END;
	    IF fileoffset=maxprintline THEN
		BEGIN
		Writeln(logfile);
		fileoffset:=0;
		END;
	    END;
	18:BEGIN
	    Write(logfile,xchr[c]);
	    fileoffset:=fileoffset+1;
	    IF fileoffset=maxprintline THEN
		Println;
	    END;
	17:BEGIN
	    Write(termout,xchr[c]);
	    termoffset:=termoffset+1;
	    IF termoffset=maxprintline THEN
		Println;
	    END;
	16:;
	20:IF tally<trickcount THEN
	       trickbuf[tally MOD errorline]:=c;
	21:BEGIN
	    IF poolptr<poolsize THEN
		BEGIN
		strpool[poolptr]:=c;
		poolptr:=poolptr+1;
		END;
	    END;
	OTHERS:Write(sendfile[selector],xchr[c])
	END;
    tally:=tally+1;
    END;
    {58}
PROCEDURE Print(s:integer);
    VAR
	j:poolpointer;
    BEGIN
    IF(s<0)OR(s>=strptr)THEN
	s:=131;
    j:=strstart[s];
    WHILE j<strstart[s+1]DO
	BEGIN
	Printchar(strpool[j]);
	j:=j+1;
	END;
    END;
    {60}
PROCEDURE Printnl(s:strnumber);
    BEGIN
    IF((¬ermoffset>0)AND(Odd(selector)))OR((fileoffset>0)AND(selector
							     >=18))THEN
	Println;
    Print(s);
    END;
    {61}
PROCEDURE Printesc(s:strnumber);
    BEGIN
    Printchar(92);
    Print(s);
    END;
    {62}
PROCEDURE Printdigs(k:eightbits);
    BEGIN
    WHILE k>0 DO
	BEGIN
	k:=k-1;
	Printchar(48+dig[k]);
	END;
    END;
    {63}
PROCEDURE Printint(n:integer);
    VAR
	k:0..20;
	m:nonnegativei;
    BEGIN
    k:=0;
    IF n<0 THEN
	BEGIN
	Printchar(45);
	IF n>-100000000 THEN
	    n:=-n
	ELSE
	    BEGIN
	    m:=-1-n;
	    n:=m DIV 10;
	    m:=(m MOD 10)+1;
	    k:=1;
	    IF m<10 THEN
		dig[0]:=m
	    ELSE
		BEGIN
		dig[0]:=0;
		n:=n+1;
		END;
	    END;
	END;
    REPEAT
	dig[k]:=n MOD 10;
	n:=n DIV 10;
	k:=k+1;
    UNTIL n=0;
    Printdigs(k);
    END;
    {245}
PROCEDURE Printcs(p:halfword);
    BEGIN
    IF p<257 THEN
	IF p>=129 THEN
	    Print(p-129)
	ELSE
	    IF p<1 THEN
		Printesc
		(317)
	    ELSE
		BEGIN
		Printesc(p-1);
		IF eqtb[2944+p].hh.rh=11 THEN
		    Printchar(32);
		END
    ELSE
	IF p>=2361 THEN
	    Printesc(317)
	ELSE
	    IF hash[p].rh=0 THEN
		Printesc
		(318)
	    ELSE
		BEGIN
		Printesc(hash[p].rh);
		Printchar(32);
		END;
    END;
    {437}
PROCEDURE Printfilenam(n,a,e:strnumber);
    BEGIN
    Print(n);
    Print(e);
    Print(a);
    END;
    {606}
PROCEDURE Printsize(s:integer);
    BEGIN
    IF s=0 THEN
	Printesc(636)
    ELSE
	IF s=16 THEN
	    Printesc(637)
	ELSE
	    Printesc(638);
    END;
    {75}
PROCEDURE Gettoken;
    FORWARD;
PROCEDURE Terminput;
    FORWARD;
PROCEDURE Showcontext;
    FORWARD;
PROCEDURE Beginfilerea;
    FORWARD;
PROCEDURE Closefilesan;
    FORWARD;
PROCEDURE Clearforerro;
    FORWARD;
PROCEDURE Debughelp;
    FORWARD;
    {77}
PROCEDURE Quit;
    BEGIN
    GOTO 9998;
    END;
    {78}
PROCEDURE Error;
    LABEL
	22,10;
    VAR
	c:asciicode;
	s1,s2,s3,s4:integer;
    BEGIN
    Printchar(46);
    Showcontext;
    IF interaction=3 THEN
	{79}
	WHILE true DO
	    BEGIN
    22:
	    Clearforerro;
	    BEGIN
	    Print(135);
	    Terminput;
	    END;
	    IF last=first THEN
		GOTO 10;
	    c:=buffer[first];
	    IF c>=97 THEN
		c:=c-32;
	    {80}
	    CASE c OF
		49,50,51,52,53,54,55,56,57:IF deletionsall THEN
					       {84}
					       BEGIN
					       s1:=curtok;
					       s2:=curcmd;
					       s3:=curchr;
					       s3:=alignstate;
					       alignstate:=1000000;
					       oktointerrup:=false;
					       IF(last>first+1)AND(buffer[first+1]>=48)AND(buffer[first+1]<=57)THEN
						   c:=
						   c*10+buffer[first+1]-48*11
					       ELSE
						   c:=c-48;
					       WHILE c>0 DO
						   BEGIN
						   Gettoken;
						   c:=c-1;
						   END;
					       curtok:=s1;
					       curcmd:=s2;
					       curchr:=s3;
					       alignstate:=s4;
					       oktointerrup:=true;
					       BEGIN
					       helpptr:=2;
					       helpline[1]:=146;
					       helpline[0]:=147;
					       END;
					       Showcontext;
					       GOTO 22;
					       END;
		68:BEGIN
		    Debughelp;
		    GOTO 22;
		    END;
		69,84:IF baseptr>0 THEN
			  BEGIN
			  selector:=21;
			  Print(136);
			  Print(inputstack[baseptr].namefield);
			  Printchar(47);
			  Printint(page);
			  Print(137);
			  Printint(line);
			  Printchar(108);
			  IF strptr<maxstrings THEN
			      BEGIN
			      pseudotypein:=strptr;
			      strptr:=strptr+1;
			      strstart[strptr]:=poolptr;
			      END;
			  selector:=19;
			  interaction:=2;
			  Quit;
			  END;
		72:{85}BEGIN
		    IF helpptr=0 THEN
			BEGIN
			helpptr:=2;
			helpline[1]:=148;
			helpline[0]:=149;
			END;
		    REPEAT
			helpptr:=helpptr-1;
			Print(helpline[helpptr]);
			Println;
		    UNTIL helpptr=0;
		    BEGIN
		    helpptr:=4;
		    helpline[3]:=150;
		    helpline[2]:=149;
		    helpline[1]:=151;
		    helpline[0]:=152;
		    END;
		    GOTO 22;
		    END;
		73:{83}BEGIN
		    Beginfilerea;
		    IF last>first+1 THEN
			BEGIN
			curinput.locfield:=first+1;
			buffer[first]:=32;
			END
		    ELSE
			BEGIN
			BEGIN
			Print(145);
			Terminput;
			END;
			curinput.locfield:=first;
			END;
		    first:=last;
		    curinput.limitfield:=last-1;
		    GOTO 10;
		    END;
		81,82,83:{82}BEGIN
		    errorcount:=0;
		    interaction:=0+c-81;
		    IF c=81 THEN
			selector:=selector-1;
		    Println;
		    GOTO 10;
		    END;
		88:BEGIN
		    BEGIN
		    Print(138);
		    Terminput;
		    END;
		    IF(last>first)AND((buffer[first]=120)OR(buffer[first]=88))THEN
			BEGIN
			interaction:=2;
			Quit;
			END;
		    END;
		OTHERS:
		END;
	    {81}Print(139);
	    Printnl(140);
	    Printnl(141);
	    IF baseptr>0 THEN
		Print(142);
	    IF deletionsall THEN
		Printnl(143);
	    Printnl(144);
	    END;
    errorcount:=errorcount+1;
    IF errorcount=100 THEN
	BEGIN
	Printnl(134);
	Quit;
	END;
    {86}
    IF interaction>0 THEN
	selector:=selector-1;
    WHILE helpptr>0 DO
	BEGIN
	helpptr:=helpptr-1;
	Printnl(helpline[helpptr]);
	END;
    Println;
    IF interaction>0 THEN
	selector:=selector+1;
    Println;
    10:
    END;
    {88}
PROCEDURE Fatalerror(s:strnumber);
    BEGIN
    Printnl(154);
    BEGIN
    helpptr:=1;
    helpline[0]:=s;
    END;
    BEGIN
    IF interaction=3 THEN
	interaction:=2;
    Error;
    IF interaction>0 THEN
	Debughelp;
    Quit;
    END;
    END;
    {89}
PROCEDURE Overflow(s:strnumber;
		   n:integer);
    BEGIN
    Printnl(155);
    Print(s);
    Printchar(61);
    Printint(n);
    Printchar(93);
    BEGIN
    helpptr:=2;
    helpline[1]:=156;
    helpline[0]:=157;
    END;
    BEGIN
    IF interaction=3 THEN
	interaction:=2;
    Error;
    IF interaction>0 THEN
	Debughelp;
    Quit;
    END;
    END;
    {90}
PROCEDURE Confusion(s:strnumber);
    BEGIN
    selector:=19;
    IF spotless THEN
	BEGIN
	Printnl(158);
	Print(s);
	Printchar(41);
	BEGIN
	helpptr:=1;
	helpline[0]:=159;
	END;
	END
    ELSE
	BEGIN
	Printnl(160);
	BEGIN
	helpptr:=2;
	helpline[1]:=161;
	helpline[0]:=162;
	END;
	END;
    BEGIN
    IF interaction=3 THEN
	interaction:=2;
    Error;
    IF interaction>0 THEN
	Debughelp;
    Quit;
    END;
    END;
    {27}
FUNCTION Aopenin(VAR f:alphafile):boolean;
    BEGIN
    Reset(f,nameoffile,'/E/O/N:19');
    Aopenin:=NOT Eof(f);
    END;
FUNCTION Aopenout(VAR f:alphafile):boolean;
    BEGIN
    Rewrite(f,nameoffile,'/O');
    Aopenout:=Eof(f);
    END;
FUNCTION Bopenin(VAR f:bytefile):boolean;
    BEGIN
    Reset(f,nameoffile,'/B:8/O/N:19');
    Bopenin:=NOT Eof(f);
    END;
FUNCTION Bopenout(VAR f:bytefile):boolean;
    BEGIN
    Rewrite(f,nameoffile,'/O/N:19');
    Bopenout:=Eof(f);
    END;
FUNCTION Wopenin(VAR f:wordfile):boolean;
    BEGIN
    Reset(f,nameoffile,'/O/N:19');
    Wopenin:=NOT Eof(f);
    END;
FUNCTION Wopenout(VAR f:wordfile):boolean;
    BEGIN
    Rewrite(f,nameoffile,'/O/N:19');
    Wopenout:=Eof(f);
    END;

{28}PROCEDURE Aclose(VAR f:alphafile);
    BEGIN
    close(f);
    END;
PROCEDURE Bclose(VAR f:bytefile);
    BEGIN
    close(f);
    END;
PROCEDURE Wclose(VAR f:wordfile);
    BEGIN
    close(f);
    END;
    {31}
FUNCTION Inputln(VAR f:alphafile):boolean;
    LABEL
	1;
    VAR
	n:integer;
	k,m:0..bufsize;
    BEGIN
    Get(f);
    IF f↑=Chr(10)THEN
	Get(f);
    IF Eof(f)THEN
	Inputln:=false
    ELSE
	BEGIN
	last:=first;
	Read(f,auxbuf:n);
	IF buffer[first]=12 THEN
	    BEGIN
	    page:=page+1;
	    line:=1;
	    END;
    1:
	IF last+n>maxbufstack THEN
	    IF last+n>=bufsize THEN
		BEGIN
		maxbufstack:=
		bufsize;
		Overflow(128,bufsize);
		END
	    ELSE
		maxbufstack:=last+n;
	IF n>0 THEN
	    BEGIN
	    m:=last;
	    IF n=72 THEN
		last:=m+71
	    ELSE
		last:=m+n;
	    FOR k:=m TO last-1 DO buffer[k]:=xord[auxbuf[k-m]];
	    IF n=72 THEN
		BEGIN
		Read(f,auxbuf:n);
		GOTO 1;
		END;
	    END
	ELSE
	    IF f↑=Chr(12)THEN
		BEGIN
		auxbuf[0]:=f↑;
		n:=1;
		GOTO 1;
		END;
	Inputln:=true;
	END;
    END;
    {37}
PROCEDURE Esci(VAR x:integer);
    EXTERN;
FUNCTION Rescan:boolean;
    EXTERN;
PROCEDURE Ptldch(c:char);
    EXTERN;
PROCEDURE Ptldbk(i:integer);
    EXTERN;
PROCEDURE Ptldln;
    EXTERN;
FUNCTION Initterminal:boolean;
    LABEL
	10;
    BEGIN
    Reset(termin,'TTY:','/O/I');
    Esci(interrupt);
    IF false THEN
	IF Rescan THEN
	    line:=999;
    WHILE true DO
	BEGIN
	buffer[first]:=0;
	IF line<>999 THEN
	    BEGIN
	    Write(termout,'**');
	    Break(termout);
	    END;
	IF NOT Inputln(termin)THEN
	    BEGIN
	    Writeln(termout);
	    Write(termout,'! End of file on the terminal... why?');
	    Initterminal:=false;
	    GOTO 10;
	    END;
	curinput.locfield:=first;
	IF line=999 THEN
	    BEGIN
	    WHILE(curinput.locfield<last)AND(buffer[curinput.
	    locfield]<>120)AND(buffer[curinput.locfield]<>88)DO curinput.locfield:=
		curinput.locfield+1;
	    IF curinput.locfield<last THEN
		curinput.locfield:=curinput.locfield+1;
	    IF(curinput.locfield<last)AND(buffer[curinput.locfield]=59)THEN
		curinput
		.locfield:=curinput.locfield+1;
	    END;
	WHILE(curinput.locfield<last)AND(buffer[curinput.locfield]=32)DO
	    curinput.locfield:=curinput.locfield+1;
	IF curinput.locfield<last THEN
	    BEGIN
	    Initterminal:=true;
	    GOTO 10;
	    END;
	Writeln(termout,'Please type the name of your input file.');
	line:=0;
	END;
    10:
    END;
    {43}
FUNCTION Makestring:strnumber;
    BEGIN
    IF strptr=maxstrings THEN
	Overflow(130,maxstrings);
    strptr:=strptr+1;
    strstart[strptr]:=poolptr;
    Makestring:=strptr-1;
    END;
    {45}
FUNCTION Streqbuf(s:strnumber;
		  k:integer):boolean;
    LABEL
	45;
    VAR
	j:poolpointer;
	result:boolean;
    BEGIN
    j:=strstart[s];
    result:=false;
    WHILE j<strstart[s+1]DO
	BEGIN
	IF strpool[j]<>buffer[k]THEN
	    GOTO 45;
	j:=j+1;
	k:=k+1;
	END;
    result:=true;
    45:
    Streqbuf:=result;
    END;
    {46}
FUNCTION Streqstr(s,t:strnumber):boolean;
    LABEL
	45;
    VAR
	j,k:poolpointer;
	result:boolean;
    BEGIN
    result:=false;
    IF(strstart[s+1]-strstart[s])<>(strstart[t+1]-strstart[t])THEN
	GOTO 45;
    j:=strstart[s];
    k:=strstart[t];
    WHILE j<strstart[s+1]DO
	BEGIN
	IF strpool[j]<>strpool[k]THEN
	    GOTO 45;
	j:=j+1;
	k:=k+1;
	END;
    result:=true;
    45:
    Streqstr:=result;
    END;
    {47}
FUNCTION Initstrings:boolean;
    LABEL
	30,10;
    VAR
	k,l:0..127;
	m,n:char;
	g:strnumber;
	a:integer;
	c:boolean;
    BEGIN
    poolptr:=0;
    strptr:=0;
    {48}
    FOR k:=0 TO 127 DO
	BEGIN
	IF(k<32)AND({49}k IN[0,9..13,27])THEN
	    BEGIN
	    BEGIN
	    strpool[poolptr]:=94;
	    poolptr:=poolptr+1;
	    END;
	    BEGIN
	    strpool[poolptr]:=94;
	    poolptr:=poolptr+1;
	    END;
	    BEGIN
	    strpool[poolptr]:=k+64;
	    poolptr:=poolptr+1;
	    END;
	    END
	ELSE
	    IF k=127 THEN
		BEGIN
		BEGIN
		strpool[poolptr]:=94;
		poolptr:=poolptr+1;
		END;
		BEGIN
		strpool[poolptr]:=94;
		poolptr:=poolptr+1;
		END;
		BEGIN
		strpool[poolptr]:=63;
		poolptr:=poolptr+1;
		END;
		END
	    ELSE
		BEGIN
		strpool[poolptr]:=k;
		poolptr:=poolptr+1;
		END;
	g:=Makestring;
	END;
    {51}nameoffile:=poolname;
    IF Aopenin(poolfile)THEN
	BEGIN
	c:=false;
	REPEAT{52}
	    BEGIN
	    IF Eof(poolfile)THEN
		BEGIN
		Writeln(termout,
			'! TEX.POOL has no check sum.');
		Initstrings:=false;
		GOTO 10;
		END;
	    Read(poolfile,m,n);
	    IF m='*'THEN
		{53}
		BEGIN
		a:=0;
		k:=1;
		WHILE true DO
		    BEGIN
		    IF(xord[n]<48)OR(xord[n]>57)THEN
			BEGIN
			Writeln(
				termout,'! TEX.POOL check sum doesn''t have nine digits.');
			Initstrings:=false;
			GOTO 10;
			END;
		    a:=10*a+xord[n]-48;
		    IF k=9 THEN
			GOTO 30;
		    k:=k+1;
		    Read(poolfile,n);
		    END;
    30:
		IF a<>404035012 THEN
		    BEGIN
		    Writeln(termout,
			    '! TEX.POOL doesn''t match; TANGLE me again.');
		    Initstrings:=false;
		    GOTO 10;
		    END;
		c:=true;
		END
	    ELSE
		BEGIN
		IF(xord[m]<48)OR(xord[m]>57)OR(xord[n]<48)OR(xord[n]>57)
		THEN
		    BEGIN
		    Writeln(termout,
			    '! TEX.POOL line doesn''t begin with two digits.');
		    Initstrings:=false;
		    GOTO 10;
		    END;
		l:=xord[m]*10+xord[n]-48*11;
		IF poolptr+l+stringvacanc>poolsize THEN
		    BEGIN
		    Writeln(termout,
			    '! You have to increase POOLSIZE.');
		    Initstrings:=false;
		    GOTO 10;
		    END;
		FOR k:=1 TO l DO
		    BEGIN
		    IF Eoln(poolfile)THEN
			BEGIN
			Writeln(termout,
				'! TEX.POOL line too short.');
			Initstrings:=false;
			GOTO 10;
			END;
		    Read(poolfile,m);
		    BEGIN
		    strpool[poolptr]:=xord[m];
		    poolptr:=poolptr+1;
		    END;
		    END;
		Readln(poolfile);
		g:=Makestring;
		END;
	    END;
	UNTIL c;
	Initstrings:=true;
	END
    ELSE
	BEGIN
	Writeln(termout,'! I can''t read TEX.POOL.');
	Initstrings:=false;
	GOTO 10;
	END;
    10:
    END;
    {64}
PROCEDURE Printoctal(n:integer);
    VAR
	k:0..22;
    BEGIN
    k:=0;
    Printchar(39);
    REPEAT
	dig[k]:=n MOD 8;
	n:=n DIV 8;
	k:=k+1;
    UNTIL n=0;
    Printdigs(k);
    END;
    {65}
PROCEDURE Printascii(c:integer);
    BEGIN
    IF(c>32)AND(c<=126)THEN
	Printchar(c)
    ELSE
	BEGIN
	IF c<0 THEN
	    Printchar(45);
	Printoctal(Abs(c));
	Printchar(32);
	END;
    END;
    {66}
PROCEDURE Printromanin(n:nonnegativei);
    LABEL
	10;
    VAR
	j,k:poolpointer;
	u,v:nonnegativei;
    BEGIN
    j:=strstart[132];
    v:=1000;
    WHILE true DO
	BEGIN
	WHILE n>=v DO
	    BEGIN
	    Printchar(strpool[j]);
	    n:=n-v;
	    END;
	IF n=0 THEN
	    GOTO 10;
	k:=j+2;
	u:=v DIV(strpool[k-1]-48);
	IF strpool[k-1]=50 THEN
	    BEGIN
	    k:=k+2;
	    u:=u DIV(strpool[k-1]-48);
	    END;
	IF n+u>=v THEN
	    BEGIN
	    Printchar(strpool[k]);
	    n:=n+u;
	    END
	ELSE
	    BEGIN
	    j:=j+2;
	    v:=v DIV(strpool[j-1]-48);
	    END;
	END;
    10:
    END;
    {67}
PROCEDURE Printcurrent;
    VAR
	j:poolpointer;
    BEGIN
    j:=strstart[strptr];
    WHILE j<poolptr DO
	BEGIN
	Printchar(strpool[j]);
	j:=j+1;
	END;
    END;
    {68}
PROCEDURE Terminput;
    VAR
	k:0..bufsize;
    BEGIN
    Break(termout);
    buffer[first]:=0;
    IF NOT Inputln(termin)THEN
	Fatalerror(133);
    selector:=selector-1;
    IF last<>first THEN
	FOR k:=first TO last-1 DO Print(buffer[k]);
    Println;
    selector:=selector+1;
    END;
    {87}
PROCEDURE Interror(n:integer);
    BEGIN
    Print(153);
    Printint(n);
    Printchar(41);
    Error;
    END;
    {93}
PROCEDURE Pauseforinst;
    BEGIN
    IF oktointerrup THEN
	BEGIN
	interaction:=3;
	IF(selector=18)OR(selector=16)THEN
	    selector:=selector+1;
	Printnl(163);
	BEGIN
	helpptr:=3;
	helpline[2]:=164;
	helpline[1]:=165;
	helpline[0]:=166;
	END;
	deletionsall:=false;
	Error;
	deletionsall:=true;
	interrupt:=0;
	END;
    END;
    {95}
FUNCTION Half(x:integer):integer;
    BEGIN
    IF Odd(x)THEN
	Half:=(x+1)DIV 2
    ELSE
	Half:=x DIV 2;
    END;
    {97}
FUNCTION Rounddecimal(k:smallnumber):scaled;
    VAR
	a:integer;
    BEGIN
    a:=0;
    WHILE k>0 DO
	BEGIN
	k:=k-1;
	a:=(a+dig[k]*131072)DIV 10;
	END;
    Rounddecimal:=(a+1)DIV 2;
    END;
    {98}
PROCEDURE Printscaled(s:scaled);
    VAR
	k:0..4;
    BEGIN
    IF s<0 THEN
	BEGIN
	Printchar(45);
	s:=-s;
	END;
    Printint(s DIV 65536);
    s:=((s MOD 65536)*3125+1024)DIV 2048;
    Printchar(46);
    REPEAT
	Printchar(48+(s DIV 10000));
	s:=10*(s MOD 10000);
    UNTIL s=0;
    END;
    {100}
FUNCTION Nxplusy(n:integer;
		 x,y:scaled):scaled;
    BEGIN
    IF n<0 THEN
	BEGIN
	x:=-x;
	n:=-n;
	END;
    IF n=0 THEN
	Nxplusy:=y
    ELSE
	IF((x<=(1073741823-y)DIV n)AND(-x<=(
					    1073741823+y)DIV n))THEN
	    Nxplusy:=n*x+y
	ELSE
	    BEGIN
	    aritherror:=true;
	    Nxplusy:=0;
	    END;
    END;
    {101}
FUNCTION Xovern(x:scaled;
		n:integer):scaled;
    VAR
	negate:boolean;
    BEGIN
    negate:=false;
    IF n=0 THEN
	BEGIN
	aritherror:=true;
	Xovern:=0;
	remainder:=x;
	END
    ELSE
	BEGIN
	IF n<0 THEN
	    BEGIN
	    x:=-x;
	    n:=-n;
	    negate:=true;
	    END;
	IF x>=0 THEN
	    BEGIN
	    Xovern:=x DIV n;
	    remainder:=x MOD n;
	    END
	ELSE
	    BEGIN
	    Xovern:=-((-x)DIV n);
	    remainder:=-((-x)MOD n);
	    END;
	END;
    IF negate THEN
	remainder:=-remainder;
    END;
    {102}
FUNCTION Xnoverd(x:scaled;
		 n,d:integer):scaled;
    VAR
	positive:boolean;
	t,u,v:nonnegativei;
    BEGIN
    IF x>=0 THEN
	positive:=true
    ELSE
	BEGIN
	x:=-x;
	positive:=false;
	END;
    t:=(x MOD 32768)*n;
    u:=(x DIV 32768)*n+(t DIV 32768);
    v:=(u MOD d)*32768+(t MOD 32768);
    IF u DIV d>=32768 THEN
	aritherror:=true
    ELSE
	u:=32768*(u DIV d)+(v DIV d
			    );
    IF positive THEN
	BEGIN
	Xnoverd:=u;
	remainder:=v MOD d;
	END
    ELSE
	BEGIN
	Xnoverd:=-u;
	remainder:=-(v MOD d);
	END;
    END;
    {103}
FUNCTION Badness(t,s:scaled):halfword;
    VAR
	r:integer;
    BEGIN
    IF t=0 THEN
	Badness:=0
    ELSE
	IF s<=0 THEN
	    Badness:=10000
	ELSE
	    BEGIN
	    IF t<=7230584 THEN
		r:=(t*297)DIV s
	    ELSE
		IF s>=1663497 THEN
		    r:=t DIV(s
			     DIV 297)
		ELSE
		    r:=t;
	    IF r>1290 THEN
		Badness:=10000
	    ELSE
		Badness:=(r*r*r+131072)DIV 262144;
	    END;
    END;

{109}PROCEDURE Printmemoryw(w:memoryword);
    BEGIN
    Printint(w.int);
    Printchar(32);
    Printscaled(w.int);
    Printchar(32);
    Printscaled(Round(65536*w.gr));
    Println;
    Printint(w.hh.lh);
    Printchar(61);
    Printint(w.hh.b0);
    Printchar(58);
    Printint(w.hh.b1);
    Printchar(59);
    Printint(w.hh.rh);
    Printchar(32);
    Printint(w.qqqq.b0);
    Printchar(58);
    Printint(w.qqqq.b1);
    Printchar(58);
    Printint(w.qqqq.b2);
    Printchar(58);
    Printint(w.qqqq.b3);
    END;
    {114}{273}
PROCEDURE Showtokenlis(p,q:integer;
		       l:integer);
    LABEL
	10;
    VAR
	m,c:integer;
	matchchr:asciicode;
	n:asciicode;
    BEGIN
    matchchr:=35;
    n:=48;
    tally:=0;
    WHILE(p<>0)AND(tally<l)DO
	BEGIN
	IF p=q THEN
	    {299}
	    BEGIN
	    firstcount:=tally;
	    trickcount:=tally+1+errorline-halferrorlin;
	    IF trickcount<errorline THEN
		trickcount:=errorline;
	    END;
	{274}
	IF(p<10000)OR(p>memend)THEN
	    BEGIN
	    Printesc(178);
	    GOTO 10;
	    END;
	IF mem[p].hh.lh>=4096 THEN
	    Printcs(mem[p].hh.lh-4096)
	ELSE
	    BEGIN
	    m:=mem[p
		   ].hh.lh DIV 256;
	    c:=mem[p].hh.lh MOD 256;
	    IF(mem[p].hh.lh<0)OR(c>127)THEN
		Printesc(361)
	    ELSE
		{275}
		CASE m OF
		    2,3,4,7,
		    8,10,11,12:Print(c);
		    1:BEGIN
			IF(mem[p].hh.rh>=10000)AND(mem[p].hh.rh<=memend)THEN
			    IF mem[mem[
				       p].hh.rh].hh.lh DIV 256=14 THEN
				Print(matchchr);
			Print(c);
			END;
		    9:Printesc(362);
		    6:BEGIN
			Print(c);
			Print(c);
			END;
		    5:BEGIN
			Print(matchchr);
			IF c<=9 THEN
			    Printchar(c+48)
			ELSE
			    BEGIN
			    Printchar(33);
			    GOTO 10;
			    END;
			END;
		    13:BEGIN
			matchchr:=c;
			Print(c);
			n:=n+1;
			Printchar(n);
			IF n>57 THEN
			    GOTO 10;
			END;
		    14:Print(363);
		    OTHERS:Printesc(361)
		    END;
	    END;
	p:=mem[p].hh.rh;
	END;
    IF p<>0 THEN
	Printesc(360);
    10:
    END;
    {285}
PROCEDURE Runaway;
    VAR
	p:halfword;
    BEGIN
    IF scannerstatu>1 THEN
	BEGIN
	Printnl(379);
	CASE scannerstatu OF
	    2:BEGIN
		Print(380);
		p:=defref;
		END;
	    3:BEGIN
		Print(381);
		p:=10003;
		END;
	    4:BEGIN
		Print(382);
		p:=10004;
		END;
	    END;
	Println;
	Showtokenlis(mem[p].hh.rh,0,errorline-10);
	END;
    END;
    {115}
FUNCTION Getavail:halfword;
    VAR
	p:halfword;
    BEGIN
    p:=avail;
    IF p<>0 THEN
	avail:=mem[avail].hh.rh
    ELSE
	IF memend<memmax THEN
	    BEGIN
	    memend:=memend+1;
	    p:=memend;
	    END
	ELSE
	    BEGIN
	    Runaway;
	    Overflow(167,memmax-0);
	    END;
    mem[p].hh.rh:=0;
    dynused:=dynused+1;
    Getavail:=p;
    END;
    {117}
PROCEDURE Flushlist(p:halfword);
    VAR
	q:halfword;
    BEGIN
    WHILE p<>0 DO
	BEGIN
	q:=mem[p].hh.rh;
	BEGIN
	mem[p].hh.rh:=avail;
	avail:=p;
	dynused:=dynused-1;
	END;
	p:=q;
	END;
    END;
    {119}
FUNCTION Getnode(s:integer):halfword;
    LABEL
	40,10;
    VAR
	p:halfword;
	q:halfword;
	r:integer;
    BEGIN
    p:=rover;
    REPEAT{121}
	q:=p+mem[p].hh.lh;
	WHILE(mem[q].hh.rh=65535)DO
	    BEGIN
	    IF q=rover THEN
		rover:=mem[q+1].hh.rh;
	    mem[mem[q+1].hh.rh+1].hh.lh:=mem[q+1].hh.lh;
	    mem[mem[q+1].hh.lh+1].hh.rh:=mem[q+1].hh.rh;
	    q:=q+mem[q].hh.lh;
	    END;
	r:=q-s;
	IF r>p+1 THEN
	    {122}
	    BEGIN
	    mem[p].hh.lh:=r-p;
	    rover:=p;
	    GOTO 40;
	    END;
	IF(r=p)AND((mem[p+1].hh.rh<>rover)OR(mem[p+1].hh.lh<>rover))THEN
	    {123}
	    BEGIN
	    IF p=rover THEN
		rover:=mem[p+1].hh.rh;
	    mem[mem[p+1].hh.rh+1].hh.lh:=mem[p+1].hh.lh;
	    mem[mem[p+1].hh.lh+1].hh.rh:=mem[p+1].hh.rh;
	    rover:=mem[p+1].hh.rh;
	    GOTO 40;
	    END;
	mem[p].hh.lh:=q-p;
	p:=mem[p+1].hh.rh;
    UNTIL p=rover;
    IF s=1073741824 THEN
	BEGIN
	Getnode:=65535;
	GOTO 10;
	END;
    Overflow(168,10000);
    40:
    mem[r].hh.rh:=0;
    varused:=varused+s;
    IF varused>maxvarused THEN
	maxvarused:=varused;
    Getnode:=r;
    10:
    END;
    {124}
PROCEDURE Freenode(p:halfword;
		   s:halfword);
    VAR
	q:halfword;
    BEGIN
    IF{156}(p<20)OR(p>=10000)THEN
	Confusion(169);
    mem[p].hh.lh:=s;
    mem[p].hh.rh:=65535;
    q:=mem[rover+1].hh.lh;
    mem[p+1].hh.lh:=q;
    mem[p+1].hh.rh:=rover;
    mem[rover+1].hh.lh:=p;
    mem[q+1].hh.rh:=p;
    varused:=varused-s;
    END;
    {125}
PROCEDURE Sortavail;
    VAR
	p,q,r:halfword;
	oldrover:halfword;
    BEGIN
    p:=Getnode(1073741824);
    p:=mem[rover+1].hh.rh;
    mem[rover+1].hh.rh:=65535;
    oldrover:=rover;
    WHILE p<>oldrover DO{126}
	IF p<rover THEN
	    BEGIN
	    q:=p;
	    p:=mem[q+1].hh.rh;
	    mem[q+1].hh.rh:=rover;
	    rover:=q;
	    END
	ELSE
	    BEGIN
	    q:=rover;
	    WHILE mem[q+1].hh.rh<p DO q:=mem[q+1].hh.rh;
	    r:=mem[p+1].hh.rh;
	    mem[p+1].hh.rh:=mem[q+1].hh.rh;
	    mem[q+1].hh.rh:=p;
	    p:=r;
	    END;
    p:=rover;
    WHILE mem[p+1].hh.rh<>65535 DO
	BEGIN
	mem[mem[p+1].hh.rh+1].hh.lh:=p;
	p:=mem[p+1].hh.rh;
	END;
    mem[p+1].hh.rh:=rover;
    mem[rover+1].hh.lh:=p;
    END;
    {130}
FUNCTION Newnullbox:halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(7);
    mem[p].hh.b0:=0;
    mem[p].hh.b1:=0;
    mem[p+1].int:=0;
    mem[p+2].int:=0;
    mem[p+3].int:=0;
    mem[p+4].int:=0;
    mem[p+5].hh.rh:=0;
    mem[p+5].hh.b0:=0;
    mem[p+5].hh.b1:=0;
    mem[p+6].gr:=0.0;
    Newnullbox:=p;
    END;
    {133}
FUNCTION Newrule:halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(4);
    mem[p].hh.b0:=2;
    mem[p].hh.b1:=0;
    mem[p+1].int:=-1073741824;
    mem[p+2].int:=-1073741824;
    mem[p+3].int:=-1073741824;
    Newrule:=p;
    END;
    {138}
FUNCTION Newligature(f,c:quarterword;
		     q:halfword):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=6;
    mem[p].hh.b1:=0;
    mem[p+1].hh.b0:=f;
    mem[p+1].hh.b1:=c;
    mem[p+1].hh.rh:=q;
    Newligature:=p;
    END;
    {139}
FUNCTION Newdisc:halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=7;
    mem[p].hh.b1:=0;
    mem[p+1].hh.lh:=0;
    mem[p+1].hh.rh:=0;
    Newdisc:=p;
    END;
    {141}
FUNCTION Newmath(w:scaled;
		 s:smallnumber):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=9;
    mem[p].hh.b1:=s;
    mem[p+1].int:=w;
    Newmath:=p;
    END;
    {145}
FUNCTION Newspec(p:halfword):halfword;
    VAR
	q:halfword;
    BEGIN
    q:=Getnode(4);
    mem[q]:=mem[p];
    mem[q].hh.rh:=0;
    mem[q+1].int:=mem[p+1].int;
    mem[q+2].int:=mem[p+2].int;
    mem[q+3].int:=mem[p+3].int;
    Newspec:=q;
    END;

{146}FUNCTION Newparamglue(n:smallnumber):halfword;
    VAR
	p:halfword;
	q:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=10;
    mem[p].hh.b1:=n+1;
    mem[p+1].hh.rh:=0;
    q:={216}eqtb[2362+n].hh.rh;
    mem[p+1].hh.lh:=q;
    mem[q].hh.rh:=mem[q].hh.rh+1;
    Newparamglue:=p;
    END;
    {147}
FUNCTION Newglue(q:halfword):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=10;
    mem[p].hh.b1:=0;
    mem[p+1].hh.rh:=0;
    mem[p+1].hh.lh:=q;
    mem[q].hh.rh:=mem[q].hh.rh+1;
    Newglue:=p;
    END;
    {148}
FUNCTION Newskipparam(n:smallnumber):halfword;
    VAR
	p:halfword;
    BEGIN
    tempptr:=Newspec({216}eqtb[2362+n].hh.rh);
    p:=Newglue(tempptr);
    mem[tempptr].hh.rh:=0;
    mem[p].hh.b1:=n+1;
    Newskipparam:=p;
    END;
    {150}
FUNCTION Newkern(w:scaled):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=11;
    mem[p].hh.b1:=0;
    mem[p+1].int:=w;
    Newkern:=p;
    END;
    {152}
FUNCTION Newpenalty(m:integer):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=12;
    mem[p].hh.b1:=0;
    mem[p+1].int:=m;
    Newpenalty:=p;
    END;
    {161}
PROCEDURE Checkmem(printlocs:boolean);
    LABEL
	31,32;
    VAR
	p,q:halfword;
	clobbered:boolean;
    BEGIN
    FOR p:=0 TO memend DO free[p]:=false;
    {162}p:=avail;
    q:=0;
    clobbered:=false;
    WHILE p<>0 DO
	BEGIN
	IF(p>memend)OR(p<10012)THEN
	    clobbered:=true
	ELSE
	    IF
		free[p]THEN
		clobbered:=true;
	IF clobbered THEN
	    BEGIN
	    Printnl(170);
	    Printint(q);
	    GOTO 31;
	    END;
	free[p]:=true;
	q:=p;
	p:=mem[q].hh.rh;
	END;
    31:;
    {163}p:=rover;
    q:=0;
    clobbered:=false;
    REPEAT
	IF(p>=10000)OR(p<20)THEN
	    clobbered:=true
	ELSE
	    IF(mem[p+1].hh.rh>=
	       10000)OR(mem[p+1].hh.rh<20)THEN
		clobbered:=true
	    ELSE
		IF NOT((mem[p].hh.
			rh=65535))OR(mem[p].hh.lh<2)OR(p+mem[p].hh.lh>10000)OR(mem[mem[p+1].hh.
										   rh+1].hh.lh<>p)THEN
		    clobbered:=true;
	IF clobbered THEN
	    BEGIN
	    Printnl(171);
	    Printint(q);
	    GOTO 32;
	    END;
	FOR q:=p TO p+mem[p].hh.lh-1 DO
	    BEGIN
	    IF free[q]THEN
		BEGIN
		Printnl(172);
		Printint(q);
		GOTO 32;
		END;
	    free[q]:=true;
	    END;
	q:=p;
	p:=mem[p+1].hh.rh;
    UNTIL p=rover;
    32:;
    {164}p:=0;
    WHILE p<=10000 DO
	BEGIN
	IF(mem[p].hh.rh=65535)THEN
	    BEGIN
	    Printnl(173);
	    Printint(p);
	    END;
	WHILE(p<=10000)AND NOT free[p]DO p:=p+1;
	WHILE(p<=10000)AND free[p]DO p:=p+1;
	END;
    IF printlocs THEN
	{165}
	BEGIN
	Printnl(174);
	FOR p:=0 TO memend DO
	    IF NOT free[p]AND((p>wasmemend)OR wasfree[p])THEN
		BEGIN
		Printchar(32);
		Printint(p);
		END;
	END;
    FOR p:=0 TO memend DO wasfree[p]:=free[p];
    wasmemend:=memend;
    END;
    {166}
PROCEDURE Searchmem(p:halfword);
    VAR
	q:halfword;
    BEGIN
    FOR q:=0 TO memend DO
	BEGIN
	IF mem[q].hh.rh=p THEN
	    BEGIN
	    Printnl(
		    175);
	    Printint(q);
	    Printchar(41);
	    END;
	IF mem[q].hh.lh=p THEN
	    BEGIN
	    Printnl(176);
	    Printint(q);
	    Printchar(41);
	    END;
	END;
    {238}
    FOR q:=1 TO 2893 DO
	BEGIN
	IF eqtb[q].hh.rh=p THEN
	    BEGIN
	    Printnl(315
		    );
	    Printint(q);
	    Printchar(41);
	    END;
	END;
    END;
    {168}
PROCEDURE Shortdisplay(p:integer);
    VAR
	n:integer;
    BEGIN
    WHILE p>0 DO
	BEGIN
	IF(p>10000)THEN
	    BEGIN
	    IF p<=memend THEN
		BEGIN
		IF mem[p].hh.b0<>fontinshortd THEN
		    BEGIN
		    Printesc(58);
		    IF(mem[p].hh.b0<0)OR(mem[p].hh.b0>fontmax)THEN
			Printchar(42)
		    ELSE
			Printint(fontcode[mem[p].hh.b0]);
		    Printchar(32);
		    fontinshortd:=mem[p].hh.b0;
		    END;
		Printascii(mem[p].hh.b1);
		END;
	    END
	ELSE
	    {169}
	    CASE mem[p].hh.b0 OF
		0,1,3,8,4,5,13:Print(177);
		2:Printchar(124);
		10:IF mem[p+1].hh.lh<>0 THEN
		       Printchar(32);
		9:Printchar(36);
		6:Shortdisplay(mem[p+1].hh.rh);
		7:BEGIN
		    Shortdisplay(mem[p+1].hh.lh);
		    Shortdisplay(mem[p+1].hh.rh);
		    n:=mem[p].hh.b1;
		    WHILE n>0 DO
			BEGIN
			p:=mem[p].hh.rh;
			n:=n-1;
			END;
		    END;
		OTHERS:
		END;
	p:=mem[p].hh.rh;
	END;
    END;
    {170}
PROCEDURE Printfontand(p:integer);
    BEGIN
    IF p>memend THEN
	Printesc(178)
    ELSE
	BEGIN
	Printesc(58);
	IF(mem[p].hh.b0<0)OR(mem[p].hh.b0>fontmax)THEN
	    Printchar(42)
	ELSE
	    Printint(fontcode[mem[p].hh.b0]);
	Printchar(32);
	Printascii(mem[p].hh.b1);
	END;
    END;
PROCEDURE Printmark(p:integer);
    BEGIN
    Printchar(123);
    IF(p<10000)OR(p>memend)THEN
	Printesc(178)
    ELSE
	Showtokenlis(mem[p].hh.rh,
		     0,maxprintline-10);
    Printchar(125);
    END;
PROCEDURE Printruledim(d:scaled);
    BEGIN
    IF(d=-1073741824)THEN
	Printchar(42)
    ELSE
	Printscaled(d);
    END;
    {171}
PROCEDURE Printglue(d:scaled;
		    order:integer;
		    s:strnumber);
    BEGIN
    Printscaled(d);
    IF(order<0)OR(order>3)THEN
	Print(179)
    ELSE
	IF order>0 THEN
	    BEGIN
	    Print(
		  180);
	    WHILE order>1 DO
		BEGIN
		Printchar(108);
		order:=order-1;
		END;
	    END
	ELSE
	    IF s<>0 THEN
		Print(s);
    END;
    {172}
PROCEDURE Printspec(p:halfword;
		    s:strnumber);
    BEGIN
    IF(p<0)OR(p>=10000)THEN
	Printchar(42)
    ELSE
	BEGIN
	Printscaled(mem[p
			+1].int);
	IF s<>0 THEN
	    Print(s);
	IF mem[p+2].int<>0 THEN
	    BEGIN
	    Print(181);
	    Printglue(mem[p+2].int,mem[p].hh.b0,s);
	    END;
	IF mem[p+3].int<>0 THEN
	    BEGIN
	    Print(182);
	    Printglue(mem[p+3].int,mem[p].hh.b1,s);
	    END;
	END;
    END;
    {173}{600}
PROCEDURE Printfamandc(p:halfword);
    BEGIN
    Printesc(326);
    Printint(mem[p].hh.b0);
    Printchar(32);
    Printascii(mem[p].hh.b1);
    END;
PROCEDURE Printdelimit(p:halfword);
    VAR
	a:integer;
    BEGIN
    a:=mem[p].qqqq.b0*256+mem[p].qqqq.b1;
    a:=a*4096+mem[p].qqqq.b2*256+mem[p].qqqq.b3;
    IF a<0 THEN
	Printint(a)
    ELSE
	Printoctal(a);
    END;
    {601}
PROCEDURE Showinfo;
    FORWARD;
PROCEDURE Printsubsidi(p:halfword;
		       c:asciicode);
    BEGIN
    IF(poolptr-strstart[strptr])<depththresho THEN
	BEGIN
	BEGIN
	strpool
	[poolptr]:=c;
	poolptr:=poolptr+1;
	END;
	tempptr:=p;
	CASE mem[p].hh.rh OF
	    1:BEGIN
		Println;
		Printcurrent;
		Printfamandc(p);
		END;
	    2:Showinfo;
	    3:IF mem[p].hh.lh=0 THEN
		  BEGIN
		  Println;
		  Printcurrent;
		  Print(613);
		  END
	      ELSE
		  Showinfo;
	    OTHERS:
	    END;
	poolptr:=poolptr-1;
	END;
    END;
    {603}
PROCEDURE Printstyle(c:integer);
    BEGIN
    CASE c DIV 2 OF
	0:Printesc(614);
	1:Printesc(615);
	2:Printesc(616);
	3:Printesc(617);
	OTHERS:Print(618)
	END;
    END;

{217}PROCEDURE Printskippar(n:integer);
    BEGIN
    CASE n OF
	0:Printesc(238);
	1:Printesc(239);
	2:Printesc(240);
	3:Printesc(241);
	4:Printesc(242);
	5:Printesc(243);
	6:Printesc(244);
	7:Printesc(245);
	8:Printesc(246);
	9:Printesc(247);
	10:Printesc(248);
	11:Printesc(249);
	12:Printesc(250);
	13:Printesc(251);
	14:Printesc(252);
	15:Printesc(253);
	16:Printesc(254);
	OTHERS:Print(255)
	END;
    END;
    {176}
PROCEDURE Shownodelist(p:halfword);
    LABEL
	10;
    VAR
	n:integer;
    BEGIN
    IF(poolptr-strstart[strptr])>depththresho THEN
	BEGIN
	IF p>0 THEN
	    Print(177);
	GOTO 10;
	END;
    n:=0;
    WHILE p>0 DO
	BEGIN
	Println;
	Printcurrent;
	IF p>memend THEN
	    BEGIN
	    Print(183);
	    GOTO 10;
	    END;
	n:=n+1;
	IF n>breadthmax THEN
	    BEGIN
	    Print(184);
	    GOTO 10;
	    END;
	{177}
	IF(p>10000)THEN
	    Printfontand(p)
	ELSE
	    CASE mem[p].hh.b0 OF
		0,1,13:{
		    178}
		    BEGIN
		    IF mem[p].hh.b0=0 THEN
			Printesc(104)
		    ELSE
			IF mem[p].hh.b0=1
			THEN
			    Printesc(118)
			ELSE
			    Printesc(186);
		    Print(187);
		    Printscaled(mem[p+3].int);
		    Printchar(43);
		    Printscaled(mem[p+2].int);
		    Print(188);
		    Printscaled(mem[p+1].int);
		    IF mem[p].hh.b0=13 THEN
			{179}
			BEGIN
			IF mem[p].hh.b1<>0 THEN
			    BEGIN
			    Print(
				  153);
			    Printint(mem[p].hh.b1+1);
			    Print(190);
			    END;
			Print(191);
			Printglue(mem[p+6].int,mem[p+5].hh.b1,0);
			Print(192);
			Printglue(mem[p+4].int,mem[p+5].hh.b0,0);
			END
		    ELSE
			BEGIN{180}
			IF(mem[p+6].gr<>0)AND(mem[p+5].hh.b0<>0)THEN
			    BEGIN
			    Print(193);
			    IF mem[p+5].hh.b0=2 THEN
				Print(194);
			    IF Abs(mem[p+6].int)<1048576 THEN
				Print(195)
			    ELSE
				IF Abs(mem[p+6].gr)>
				20000.0 THEN
				    BEGIN
				    IF mem[p+6].gr>0 THEN
					Printchar(62)
				    ELSE
					Print(196);
				    Printglue(20000*65536,mem[p+5].hh.b1,0);
				    END
				ELSE
				    Printglue(Round(mem[p+6].gr*65536),mem[p+5].hh.b1,0);
			    END;
			IF mem[p+4].int<>0 THEN
			    BEGIN
			    Print(189);
			    Printscaled(mem[p+4].int);
			    END;
			END;
		    BEGIN
		    BEGIN
		    strpool[poolptr]:=46;
		    poolptr:=poolptr+1;
		    END;
		    Shownodelist(mem[p+5].hh.rh);
		    poolptr:=poolptr-1;
		    END;
		    END;
		2:{181}BEGIN
		    Printesc(197);
		    Printruledim(mem[p+3].int);
		    Printchar(43);
		    Printruledim(mem[p+2].int);
		    Print(188);
		    Printruledim(mem[p+1].int);
		    END;
		3:{182}BEGIN
		    Printesc(198);
		    Printint(mem[p].hh.b1);
		    Print(199);
		    Printscaled(mem[p+1].int);
		    BEGIN
		    BEGIN
		    strpool[poolptr]:=46;
		    poolptr:=poolptr+1;
		    END;
		    Shownodelist(mem[p+2].int);
		    poolptr:=poolptr-1;
		    END;
		    END;
		8:{1234}CASE mem[p].hh.b1 OF
		    0:BEGIN
			Printesc(1049);
			Printint(mem[p+1].hh.lh);
			Printchar(61);
			Printfilenam(mem[p+1].hh.rh,mem[p+2].hh.lh,mem[p+2].hh.rh);
			END;
		    1:BEGIN
			Printesc(1050);
			Printint(mem[p+1].hh.lh);
			Printmark(mem[p+1].hh.rh);
			END;
		    2:BEGIN
			Printesc(1051);
			Printint(mem[p+1].hh.lh);
			END;
		    3:BEGIN
			Printesc(1052);
			Printmark(mem[p+1].hh.rh);
			END;
		    OTHERS:Print(1055)
		    END;
		10:{183}IF mem[p].hh.b1>=100 THEN
			    {184}
			    BEGIN
			    Printchar(92);
			    IF mem[p].hh.b1=101 THEN
				Printchar(99)
			    ELSE
				IF mem[p].hh.b1=102 THEN
				    Printchar(120);
			    Print(204);
			    Printspec(mem[p+1].hh.lh,0);
			    BEGIN
			    BEGIN
			    strpool[poolptr]:=46;
			    poolptr:=poolptr+1;
			    END;
			    Shownodelist(mem[p+1].hh.rh);
			    poolptr:=poolptr-1;
			    END;
			    END
			ELSE
			    BEGIN
			    Printesc(200);
			    IF mem[p].hh.b1<>0 THEN
				BEGIN
				Printchar(40);
				IF mem[p].hh.b1<98 THEN
				    Printskippar(mem[p].hh.b1-1)
				ELSE
				    IF mem[p].hh.b1
				    =98 THEN
					Printesc(201)
				    ELSE
					Printesc(202);
				Printchar(41);
				END;
			    IF mem[p].hh.b1<>98 THEN
				BEGIN
				Printchar(32);
				IF mem[p].hh.b1<98 THEN
				    Printspec(mem[p+1].hh.lh,0)
				ELSE
				    Printspec(mem[p
						  +1].hh.lh,203);
				END;
			    END;
		11:{185}IF mem[p].hh.b1=0 THEN
			    BEGIN
			    Printesc(205);
			    Printscaled(mem[p+1].int);
			    END
			ELSE
			    BEGIN
			    Printesc(206);
			    Printscaled(mem[p+1].int);
			    Print(203);
			    END;
		9:{186}BEGIN
		    Printesc(207);
		    IF mem[p].hh.b1=0 THEN
			Print(208)
		    ELSE
			Print(209);
		    IF mem[p+1].int<>0 THEN
			BEGIN
			Print(210);
			Printscaled(mem[p+1].int);
			END;
		    END;
		6:{187}BEGIN
		    Printfontand(p+1);
		    Print(211);
		    fontinshortd:=mem[p+1].hh.b0;
		    Shortdisplay(mem[p+1].hh.rh);
		    Printchar(41);
		    END;
		12:{188}BEGIN
		    Printesc(212);
		    Printint(mem[p+1].int);
		    END;
		7:{189}BEGIN
		    Printesc(213);
		    IF mem[p].hh.b1>0 THEN
			BEGIN
			Print(214);
			Printint(mem[p].hh.b1);
			END;
		    BEGIN
		    BEGIN
		    strpool[poolptr]:=46;
		    poolptr:=poolptr+1;
		    END;
		    Shownodelist(mem[p+1].hh.lh);
		    poolptr:=poolptr-1;
		    END;
		    BEGIN
		    strpool[poolptr]:=124;
		    poolptr:=poolptr+1;
		    END;
		    Shownodelist(mem[p+1].hh.rh);
		    poolptr:=poolptr-1;
		    END;
		4:{190}BEGIN
		    Printesc(215);
		    Printmark(mem[p+1].int);
		    END;
		5:{191}BEGIN
		    Printesc(216);
		    BEGIN
		    BEGIN
		    strpool[poolptr]:=46;
		    poolptr:=poolptr+1;
		    END;
		    Shownodelist(mem[p+1].int);
		    poolptr:=poolptr-1;
		    END;
		    END;
		{599}14:Printstyle(mem[p].hh.b1);
		15,16,17,18,19,20,21,22,23,26,25,28,27,29,30:{604}BEGIN
		    CASE mem[p].hh.
			b0 OF
			15:Printesc(619);
			16:Printesc(620);
			17:Printesc(621);
			18:Printesc(622);
			19:Printesc(623);
			20:Printesc(624);
			21:Printesc(625);
			22:Printesc(626);
			26:Printesc(627);
			25:Printesc(628);
			28:Printesc(344);
			23:BEGIN
			    Printesc(350);
			    Printdelimit(p+4);
			    END;
			27:BEGIN
			    Printesc(339);
			    Printfamandc(p+4);
			    END;
			29:BEGIN
			    Printesc(629);
			    Printdelimit(p+1);
			    END;
			30:BEGIN
			    Printesc(630);
			    Printdelimit(p+1);
			    END;
			END;
		    IF mem[p].hh.b1<>0 THEN
			Printesc(343);
		    IF mem[p].hh.b0<29 THEN
			Printsubsidi(p+1,46);
		    Printsubsidi(p+2,40);
		    Printsubsidi(p+3,91);
		    END;
		24:{605}BEGIN
		    Printesc(631);
		    Print(632);
		    IF mem[p+1].int=1073741824 THEN
			Print(633)
		    ELSE
			Printscaled(mem[p+1].int)
			;
		    IF(mem[p+4].qqqq.b0<>0)OR(mem[p+4].qqqq.b1<>0)OR(mem[p+4].qqqq.b2<>0)OR(
											    mem[p+4].qqqq.b3<>0)THEN
			BEGIN
			Print(634);
			Printdelimit(p+4);
			END;
		    IF(mem[p+5].qqqq.b0<>0)OR(mem[p+5].qqqq.b1<>0)OR(mem[p+5].qqqq.b2<>0)OR(
											    mem[p+5].qqqq.b3<>0)THEN
			BEGIN
			Print(635);
			Printdelimit(p+5);
			END;
		    Printsubsidi(p+2,92);
		    Printsubsidi(p+3,47);
		    END;
		OTHERS:Print(185)
		END;
	p:=mem[p].hh.rh;
	END;
    10:
    END;
    {192}
PROCEDURE Showbox(p:halfword);
    BEGIN{224}
    depththresho:=eqtb[3608].int;
    breadthmax:=eqtb[3607].int;
    IF breadthmax<=0 THEN
	breadthmax:=5;
    IF poolptr+depththresho>=poolsize THEN
	depththresho:=poolsize-poolptr-1;
    Shownodelist(p);
    Println;
    END;
    {194}
PROCEDURE Deletetokenr(p:halfword);
    BEGIN
    IF mem[p].hh.lh=0 THEN
	Flushlist(p)
    ELSE
	mem[p].hh.lh:=mem[p].hh.lh
	-1;
    END;
    {195}
PROCEDURE Deletegluere(p:halfword);
    BEGIN
    IF mem[p].hh.rh=0 THEN
	Freenode(p,4)
    ELSE
	mem[p].hh.rh:=mem[p].hh.
	rh-1;
    END;
    {196}
PROCEDURE Flushnodelis(p:halfword);
    LABEL
	30;
    VAR
	q:halfword;
    BEGIN
    WHILE p<>0 DO
	BEGIN
	q:=mem[p].hh.rh;
	IF(p>10000)THEN
	    BEGIN
	    mem[p].hh.rh:=avail;
	    avail:=p;
	    dynused:=dynused-1;
	    END
	ELSE
	    BEGIN
	    CASE mem[p].hh.b0 OF
		0,1,13:BEGIN
		    Flushnodelis(mem[p+5].
				 hh.rh);
		    Freenode(p,7);
		    GOTO 30;
		    END;
		2:BEGIN
		    Freenode(p,4);
		    GOTO 30;
		    END;
		3:BEGIN
		    Flushnodelis(mem[p+2].int);
		    Freenode(p,3);
		    GOTO 30;
		    END;
		8:{1236}BEGIN
		    CASE mem[p].hh.b1 OF
			0:Freenode(p,3);
			1,3:BEGIN
			    Deletetokenr(mem[p+1].hh.rh);
			    Freenode(p,2);
			    GOTO 30;
			    END;
			2:Freenode(p,2);
			OTHERS:Confusion(1057)
			END;
		    GOTO 30;
		    END;
		10:BEGIN
		    Deletegluere(mem[p+1].hh.lh);
		    Flushnodelis(mem[p+1].hh.rh);
		    END;
		11,9,12:;
		6:Flushnodelis(mem[p+1].hh.rh);
		4:Deletetokenr(mem[p+1].int);
		7:BEGIN
		    Flushnodelis(mem[p+1].hh.lh);
		    Flushnodelis(mem[p+1].hh.rh);
		    END;
		5:Flushnodelis(mem[p+1].int);
		OTHERS:Confusion(217)
		END;
	    Freenode(p,2);
    30:
	    END;
	p:=q;
	END;
    END;
    {198}
FUNCTION Copynodelist(p:halfword):halfword;
    VAR
	h:halfword;
	q:halfword;
	r:halfword;
	words:0..5;
    BEGIN
    h:=Getavail;
    q:=h;
    WHILE p<>0 DO
	BEGIN{199}
	words:=1;
	IF(p>10000)THEN
	    r:=Getavail
	ELSE
	    {200}
	    CASE mem[p].hh.b0 OF
		0,1,13:BEGIN
		    r
		    :=Getnode(7);
		    mem[r+6]:=mem[p+6];
		    mem[r+5]:=mem[p+5];
		    mem[r+5].hh.rh:=Copynodelist(mem[p+5].hh.rh);
		    words:=5;
		    END;
		2:BEGIN
		    r:=Getnode(4);
		    words:=4;
		    END;
		3:BEGIN
		    r:=Getnode(3);
		    mem[r+2].int:=Copynodelist(mem[p+2].int);
		    words:=2;
		    END;
		8:{1235}CASE mem[p].hh.b1 OF
		    0:BEGIN
			r:=Getnode(3);
			words:=3;
			END;
		    1,3:BEGIN
			r:=Getnode(2);
			mem[mem[p+1].hh.rh].hh.lh:=mem[mem[p+1].hh.rh].hh.lh+1;
			words:=2;
			END;
		    2:BEGIN
			r:=Getnode(2);
			words:=2;
			END;
		    OTHERS:Confusion(1056)
		    END;
		10:BEGIN
		    r:=Getnode(2);
		    mem[mem[p+1].hh.lh].hh.rh:=mem[mem[p+1].hh.lh].hh.rh+1;
		    mem[r+1].hh.lh:=mem[p+1].hh.lh;
		    mem[r+1].hh.rh:=Copynodelist(mem[p+1].hh.rh);
		    END;
		11,9,12:BEGIN
		    r:=Getnode(2);
		    words:=2;
		    END;
		6:BEGIN
		    r:=Getnode(2);
		    mem[r+1]:=mem[p+1];
		    mem[r+1].hh.rh:=Copynodelist(mem[p+1].hh.rh);
		    END;
		7:BEGIN
		    r:=Getnode(2);
		    mem[r+1].hh.lh:=Copynodelist(mem[p+1].hh.lh);
		    mem[r+1].hh.rh:=Copynodelist(mem[p+1].hh.rh);
		    END;
		4:BEGIN
		    r:=Getnode(2);
		    mem[mem[p+1].int].hh.lh:=mem[mem[p+1].int].hh.lh+1;
		    words:=2;
		    END;
		5:BEGIN
		    r:=Getnode(2);
		    mem[r+1].int:=Copynodelist(mem[p+1].int);
		    END;
		OTHERS:Confusion(218)
		END;
	WHILE words>0 DO
	    BEGIN
	    words:=words-1;
	    mem[r+words]:=mem[p+words];
	    END;
	mem[q].hh.rh:=r;
	q:=r;
	p:=mem[p].hh.rh;
	END;
    mem[q].hh.rh:=0;
    q:=mem[h].hh.rh;
    BEGIN
    mem[h].hh.rh:=avail;
    avail:=h;
    dynused:=dynused-1;
    END;
    Copynodelist:=q;
    END;

{205}PROCEDURE Printmode(m:integer);
    BEGIN
    IF m>0 THEN
	CASE m DIV(92)OF
	    0:Print(219);
	    1:Print(220);
	    2:Print(221);
	    END
    ELSE
	CASE(-m)DIV(92)OF
	    0:Print(222);
	    1:Print(223);
	    2:Print(207);
	    END;
    Print(224);
    END;
    {210}
PROCEDURE Pushnest;
    BEGIN
    IF nestptr>maxneststack THEN
	BEGIN
	maxneststack:=nestptr;
	IF nestptr=nestsize THEN
	    Overflow(225,nestsize);
	END;
    nest[nestptr]:=curlist;
    nestptr:=nestptr+1;
    curlist.headfield:=Getavail;
    curlist.tailfield:=curlist.headfield;
    curlist.alreadyfield:=0;
    curlist.mlfield:=line;
    END;
    {211}
PROCEDURE Popnest;
    BEGIN
    BEGIN
    mem[curlist.headfield].hh.rh:=avail;
    avail:=curlist.headfield;
    dynused:=dynused-1;
    END;
    nestptr:=nestptr-1;
    curlist:=nest[nestptr];
    END;
    {212}
PROCEDURE Showactiviti;
    VAR
	p:0..nestsize;
	m:-185..185;
	a:integer;
	q,r:halfword;
    BEGIN
    nest[nestptr]:=curlist;
    Printnl(226);
    Println;
    FOR p:=nestptr DOWNTO 0 DO
	BEGIN
	m:=nest[p].modefield;
	a:=nest[p].auxfield;
	Printnl(227);
	Printmode(m);
	Print(228);
	Printint(Abs(nest[p].mlfield));
	IF nest[p].mlfield<0 THEN
	    Print(229);
	IF p=0 THEN
	    BEGIN
	    Printnl(230);
	    {876}Showbox(mem[10002].hh.rh);
	    IF pagecontents>0 THEN
		BEGIN
		Printnl(711);
		Printscaled(pagesofar[1]);
		IF pagesofar[2]<>0 THEN
		    BEGIN
		    Print(181);
		    Printscaled(pagesofar[2]);
		    Print(226);
		    END;
		IF pagesofar[3]<>0 THEN
		    BEGIN
		    Print(181);
		    Printscaled(pagesofar[3]);
		    Print(180);
		    END;
		IF pagesofar[4]<>0 THEN
		    BEGIN
		    Print(181);
		    Printscaled(pagesofar[4]);
		    Print(712);
		    END;
		IF pagesofar[5]<>0 THEN
		    BEGIN
		    Print(181);
		    Printscaled(pagesofar[5]);
		    Print(713);
		    END;
		IF pagesofar[6]<>0 THEN
		    BEGIN
		    Print(182);
		    Printscaled(pagesofar[6]);
		    END;
		Printnl(714);
		Printscaled(pagesize);
		r:=mem[10000].hh.rh;
		WHILE r<>10000 DO
		    BEGIN
		    Println;
		    Printesc(198);
		    a:=mem[r].hh.b1;
		    Printint(a);
		    Print(715);
		    a:=Xovern(mem[r+1].int,1000)*eqtb[3622+a].int;
		    Printscaled(a);
		    IF mem[r].hh.b0=1 THEN
			BEGIN
			q:=10002;
			a:=0;
			REPEAT
			    q:=mem[q].hh.rh;
			    IF(mem[q].hh.b0=3)AND(mem[q].hh.b1=mem[r].hh.b1)THEN
				a:=a+1;
			UNTIL q=mem[r+3].hh.lh;
			Print(716);
			Printint(a);
			Print(717);
			END;
		    r:=mem[r].hh.rh;
		    END;
		END;
	    Printnl(231);
	    END;
	Showbox(mem[nest[p].headfield].hh.rh);
	CASE Abs(m)DIV(92)OF
	    0:BEGIN
		Printnl(232);
		IF a<=-65536000 THEN
		    Print(233)
		ELSE
		    Printscaled(a);
		IF nest[p].alreadyfield<>0 THEN
		    BEGIN
		    Print(234);
		    Printint(nest[p].alreadyfield);
		    Print(235);
		    END;
		END;
	    1:BEGIN
		Printnl(236);
		Printint(a);
		END;
	    2:IF a<>0 THEN
		  BEGIN
		  Print(237);
		  Showbox(a);
		  END;
	    END;
	END;
    END;
    {225}
PROCEDURE Printparam(n:integer);
    BEGIN
    CASE n OF
	0:Printesc(258);
	1:Printesc(259);
	2:Printesc(260);
	3:Printesc(261);
	4:Printesc(262);
	5:Printesc(263);
	6:Printesc(264);
	7:Printesc(265);
	8:Printesc(266);
	9:Printesc(267);
	10:Printesc(268);
	11:Printesc(269);
	12:Printesc(270);
	13:Printesc(271);
	14:Printesc(272);
	15:Printesc(273);
	16:Printesc(274);
	17:Printesc(275);
	18:Printesc(276);
	19:Printesc(277);
	20:Printesc(278);
	21:Printesc(279);
	22:Printesc(280);
	23:Printesc(281);
	24:Printesc(282);
	25:Printesc(283);
	26:Printesc(284);
	27:Printesc(285);
	28:Printesc(286);
	29:Printesc(287);
	30:Printesc(288);
	31:Printesc(289);
	32:Printesc(290);
	33:Printesc(291);
	34:Printesc(292);
	35:Printesc(293);
	36:Printesc(294);
	37:Printesc(295);
	OTHERS:Print(296)
	END;
    END;
    {229}
PROCEDURE Fixdateandti;
    VAR
	t:integer;
	date:integer;
	g:boolean;
    BEGIN
    calli(131137,,t,t,g);
    date:=t DIV 262144;
    eqtb[3603].int:=(t MOD 262144)DIV 60;
    eqtb[3604].int:=(date MOD 31)+1;
    eqtb[3605].int:=((date DIV 31)MOD 12)+1;
    eqtb[3606].int:=(date DIV(31*12))+1964;
    END;
    {230}
PROCEDURE Begindiagnos;
    BEGIN
    oldsetting:=selector;
    IF(eqtb[3612].int=0)AND(selector=19)THEN
	selector:=selector-1;
    END;
PROCEDURE Enddiagnosti(blankline:boolean);
    BEGIN
    Printnl(226);
    IF blankline THEN
	Println;
    selector:=oldsetting;
    END;
    {232}
PROCEDURE Printlengthp(n:integer);
    BEGIN
    CASE n OF
	0:Printesc(297);
	1:Printesc(298);
	2:Printesc(299);
	3:Printesc(300);
	4:Printesc(301);
	5:Printesc(302);
	6:Printesc(303);
	7:Printesc(304);
	8:Printesc(305);
	9:Printesc(306);
	10:Printesc(307);
	11:Printesc(308);
	12:Printesc(309);
	13:Printesc(310);
	14:Printesc(311);
	15:Printesc(312);
	16:Printesc(313);
	OTHERS:Print(314)
	END;
    END;
    {242}
FUNCTION Idlookup(j,l:integer):halfword;
    LABEL
	40;
    VAR
	h:integer;
	p:halfword;
	k:halfword;
    BEGIN{244}
    h:=buffer[j];
    FOR k:=j+1 TO j+l-1 DO
	BEGIN
	h:=h+h+buffer[k];
	WHILE h>=1777 DO h:=h-1777;
	END;
    p:=h+257;
    WHILE true DO
	BEGIN
	IF(hash[p].rh>0)AND((strstart[hash[p].rh+1]-strstart
			     [hash[p].rh])=l)THEN
	    IF Streqbuf(hash[p].rh,j)THEN
		GOTO 40;
	IF hash[p].lh=0 THEN
	    BEGIN
	    IF nonewcontrol THEN
		p:=2361
	    ELSE
		{243}
		BEGIN
		IF hash[p].rh>0 THEN
		    BEGIN
		    REPEAT
			IF(hashused=257)THEN
			    Overflow(316,2100
				     );
			hashused:=hashused-1;
		    UNTIL hash[hashused].rh=0;
		    hash[p].lh:=hashused;
		    p:=hashused;
		    END;
		BEGIN
		IF poolptr+l>poolsize THEN
		    Overflow(129,poolsize);
		END;
		FOR k:=j TO j+l-1 DO
		    BEGIN
		    strpool[poolptr]:=buffer[k];
		    poolptr:=poolptr+1;
		    END;
		hash[p].rh:=Makestring;
		cscount:=cscount+1;
		END;
	    GOTO 40;
	    END;
	p:=hash[p].lh;
	END;
    40:
    Idlookup:=p;
    END;
    {246}
PROCEDURE Sprintcs(p:halfword);
    BEGIN
    IF p<257 THEN
	IF p<129 THEN
	    Printesc(p-1)
	ELSE
	    Print(p-129)
    ELSE
	Printesc(hash[p].rh);
    END;
    {247}
PROCEDURE Primitive(s:strnumber;
		    c:quarterword;
		    o:halfword);
    VAR
	k:poolpointer;
	j:smallnumber;
	l:smallnumber;
    BEGIN
    IF s<128 THEN
	curval:=s+1
    ELSE
	BEGIN
	k:=strstart[s];
	l:=strstart[s+1]-k;
	FOR j:=0 TO l-1 DO buffer[j]:=strpool[k+j];
	curval:=Idlookup(0,l);
	BEGIN
	strptr:=strptr-1;
	poolptr:=strstart[strptr];
	END;
	hash[curval].rh:=s;
	END;
    eqtb[curval].hh.b1:=1;
    eqtb[curval].hh.b0:=c;
    eqtb[curval].hh.rh:=o;
    END;

{257}PROCEDURE Newsavelevel(c:groupcode);
    BEGIN
    IF saveptr>maxsavestack THEN
	BEGIN
	maxsavestack:=saveptr;
	IF maxsavestack>savesize-6 THEN
	    Overflow(351,savesize);
	END;
    savestack[saveptr].hh.b0:=2;
    savestack[saveptr].hh.b1:=curgroup;
    savestack[saveptr].hh.rh:=curboundary;
    IF curlevel=255 THEN
	Overflow(352,255);
    curboundary:=saveptr;
    curlevel:=curlevel+1;
    saveptr:=saveptr+1;
    curgroup:=c;
    END;
    {258}
PROCEDURE Eqdestroy(w:memoryword);
    VAR
	q:halfword;
    BEGIN
    CASE w.hh.b0 OF
	94,95,96,97:Deletetokenr(w.hh.rh);
	98:Deletegluere(w.hh.rh);
	99:BEGIN
	    q:=w.hh.rh;
	    IF q<>0 THEN
		Freenode(q,mem[q].hh.rh+mem[q].hh.rh+1);
	    END;
	100:Flushnodelis(w.hh.rh);
	OTHERS:
	END;
    END;
    {259}
PROCEDURE Eqsave(p:halfword;
		 l:quarterword);
    BEGIN
    IF saveptr>maxsavestack THEN
	BEGIN
	maxsavestack:=saveptr;
	IF maxsavestack>savesize-6 THEN
	    Overflow(351,savesize);
	END;
    IF l=0 THEN
	savestack[saveptr].hh.b0:=1
    ELSE
	BEGIN
	savestack[saveptr]:=
	eqtb[p];
	saveptr:=saveptr+1;
	savestack[saveptr].hh.b0:=0;
	END;
    savestack[saveptr].hh.b1:=l;
    savestack[saveptr].hh.rh:=p;
    saveptr:=saveptr+1;
    END;
    {260}
PROCEDURE Eqdefine(p:halfword;
		   t:quarterword;
		   e:halfword);
    BEGIN
    IF eqtb[p].hh.b1=curlevel THEN
	Eqdestroy(eqtb[p])
    ELSE
	IF curlevel>
	1 THEN
	    Eqsave(p,eqtb[p].hh.b1);
    eqtb[p].hh.b1:=curlevel;
    eqtb[p].hh.b0:=t;
    eqtb[p].hh.rh:=e;
    END;
    {261}
PROCEDURE Eqworddefine(p:halfword;
		       w:integer);
    BEGIN
    IF xeqlevel[p]<>curlevel THEN
	BEGIN
	Eqsave(p,xeqlevel[p]);
	xeqlevel[p]:=curlevel;
	END;
    eqtb[p].int:=w;
    END;
    {262}
PROCEDURE Geqdefine(p:halfword;
		    t:quarterword;
		    e:halfword);
    BEGIN
    Eqdestroy(eqtb[p]);
    eqtb[p].hh.b1:=1;
    eqtb[p].hh.b0:=t;
    eqtb[p].hh.rh:=e;
    END;
PROCEDURE Geqworddefin(p:halfword;
		       w:integer);
    BEGIN
    eqtb[p].int:=w;
    xeqlevel[p]:=1;
    END;
    {263}
PROCEDURE Unsave;
    LABEL
	30;
    VAR
	p:halfword;
	l:quarterword;
    BEGIN
    IF curlevel>1 THEN
	BEGIN
	curlevel:=curlevel-1;
	{264}
	WHILE true DO
	    BEGIN
	    saveptr:=saveptr-1;
	    IF savestack[saveptr].hh.b0=2 THEN
		GOTO 30;
	    p:=savestack[saveptr].hh.rh;
	    IF savestack[saveptr].hh.b0=0 THEN
		BEGIN
		l:=savestack[saveptr].hh.b1;
		saveptr:=saveptr-1;
		END
	    ELSE
		savestack[saveptr]:=eqtb[2361];
	    {265}
	    IF p<3584 THEN
		IF eqtb[p].hh.b1=1 THEN
		    Eqdestroy(savestack[saveptr]
			      )
		ELSE
		    BEGIN
		    Eqdestroy(eqtb[p]);
		    eqtb[p]:=savestack[saveptr];
		    END
	    ELSE
		IF xeqlevel[p]<>1 THEN
		    BEGIN
		    eqtb[p]:=savestack[saveptr];
		    xeqlevel[p]:=l;
		    END;
	    END;
    30:
	curgroup:=savestack[saveptr].hh.b1;
	curboundary:=savestack[saveptr].hh.rh;
	END
    ELSE
	Confusion(353);
    END;
    {266}
PROCEDURE Leavetranspa;
    VAR
	j,k:0..savesize;
    BEGIN
    j:=savestack[curboundary].hh.rh;
    curgroup:=savestack[curboundary].hh.b1;
    IF saveptr>1 THEN
	FOR k:=curboundary TO saveptr-2 DO savestack[k]:=
	    savestack[k+1];
    saveptr:=saveptr-1;
    curboundary:=j;
    END;
    {269}
PROCEDURE Preparemag;
    BEGIN
    IF(magset>0)AND(eqtb[3600].int<>magset)THEN
	BEGIN
	Printnl(354);
	Printint(eqtb[3600].int);
	Print(355);
	BEGIN
	helpptr:=2;
	helpline[1]:=356;
	helpline[0]:=357;
	END;
	Interror(magset);
	Geqworddefin(3600,magset);
	END;
    IF(eqtb[3600].int<=0)OR(eqtb[3600].int>32768)THEN
	BEGIN
	Printnl(358);
	BEGIN
	helpptr:=1;
	helpline[0]:=359;
	END;
	Interror(eqtb[3600].int);
	Geqworddefin(3600,1000);
	END;
    magset:=eqtb[3600].int;
    END;
    {276}
PROCEDURE Tokenshow(p:halfword);
    BEGIN
    IF p=0 THEN
	Print(364)
    ELSE
	Showtokenlis(mem[p].hh.rh,0,1000);
    END;
    {278}
PROCEDURE Printcmdchr(cmd:quarterword;
		      chrcode:halfword);
    BEGIN
    CASE cmd OF
	1:BEGIN
	    Print(365);
	    Printascii(chrcode);
	    END;
	2:BEGIN
	    Print(366);
	    Printascii(chrcode);
	    END;
	3:BEGIN
	    Print(367);
	    Printascii(chrcode);
	    END;
	4:IF chrcode=128 THEN
	      Printesc(368)
	  ELSE
	      BEGIN
	      Print(369);
	      Printascii(chrcode);
	      END;
	5:Printesc(370);
	6:BEGIN
	    Print(371);
	    Printascii(chrcode);
	    END;
	7:BEGIN
	    Print(372);
	    Printascii(chrcode);
	    END;
	8:BEGIN
	    Print(373);
	    Printascii(chrcode);
	    END;
	9:Print(374);
	10:Print(375);
	11:BEGIN
	    Print(376);
	    Printascii(chrcode);
	    END;
	12:BEGIN
	    Print(377);
	    Printascii(chrcode);
	    END;
	{219}73:Printskippar(chrcode);
	{222}70:IF chrcode=2636 THEN
		    Printesc(256)
		ELSE
		    Printesc(257);
	{227}71:Printparam(chrcode);
	{234}72:Printlengthp(chrcode);
	{249}0:Printesc(319);
	81:Printesc(320);
	16:Printesc(321);
	17:Printesc(322);
	18:Printesc(215);
	19:Printesc(323);
	40:Printesc(324);
	83:Printesc(325);
	78:Printesc(58);
	79:Printesc(326);
	65:Printesc(327);
	88:Printesc(328);
	24:Printesc(329);
	25:Printesc(330);
	68:Printesc(331);
	32:Printesc(332);
	33:Printesc(333);
	34:Printesc(334);
	35:Printesc(335);
	36:Printesc(336);
	37:Printesc(198);
	38:Printesc(216);
	39:Printesc(337);
	89:Printesc(338);
	42:Printesc(47);
	43:Printesc(339);
	44:Printesc(340);
	74:Printesc(341);
	15:Printesc(342);
	49:Printesc(343);
	52:Printesc(201);
	53:Printesc(344);
	56:Printesc(345);
	57:Printesc(346);
	62:Printesc(347);
	60:Printesc(348);
	61:Printesc(349);
	63:Printesc(32);
	64:Printesc(350);
	{313}13:Printesc(397);
	{347}93:CASE chrcode OF
	    1:Printesc(427);
	    2:Printesc(428);
	    3:Printesc(429);
	    4:Printesc(430);
	    OTHERS:Printesc(426)
	    END;
	{374}67:IF chrcode=0 THEN
		    Printesc(458)
		ELSE
		    IF chrcode=1 THEN
			Printesc(
				 459)
		    ELSE
			Printesc(460);
	75:Printesc(461);
	66:IF chrcode=0 THEN
	       Printesc(462)
	   ELSE
	       Printesc(463);
	{379}69:IF chrcode=1 THEN
		    Printesc(467)
		ELSE
		    Printesc(466);
	{939}14:IF chrcode=1 THEN
		    Printesc(751)
		ELSE
		    Printesc(750);
	{947}26:CASE chrcode OF
	    4:Printesc(753);
	    0:Printesc(754);
	    1:Printesc(755);
	    2:Printesc(756);
	    OTHERS:Printesc(757)
	    END;
	27:CASE chrcode OF
	    4:Printesc(758);
	    0:Printesc(759);
	    1:Printesc(760);
	    2:Printesc(761);
	    OTHERS:Printesc(762)
	    END;
	28:Printesc(202);
	29:Printesc(205);
	30:Printesc(206);
	{960}22:IF chrcode=1 THEN
		    Printesc(783)
		ELSE
		    Printesc(784);
	23:IF chrcode=1 THEN
	       Printesc(785)
	   ELSE
	       Printesc(786);
	21:CASE chrcode OF
	    0:Printesc(787);
	    1:Printesc(788);
	    2:Printesc(789);
	    3:Printesc(790);
	    4:Printesc(791);
	    5:Printesc(792);
	    OTHERS:Printesc(793);
	    END;
	31:IF chrcode=100 THEN
	       Printesc(795)
	   ELSE
	       IF chrcode=101 THEN
		   Printesc(
			    796)
	       ELSE
		   IF chrcode=102 THEN
		       Printesc(797)
		   ELSE
		       Printesc(794);
	{978}41:IF chrcode=0 THEN
		    Printesc(812)
		ELSE
		    Printesc(811);
	{1004}45:IF chrcode=1 THEN
		     Printesc(45)
		 ELSE
		     Printesc(213);
	{1033}46:IF chrcode=1 THEN
		     Printesc(859)
		 ELSE
		     Printesc(858);
	{1046}48:CASE chrcode OF
	    15:Printesc(619);
	    16:Printesc(620);
	    17:Printesc(621);
	    18:Printesc(622);
	    19:Printesc(623);
	    20:Printesc(624);
	    21:Printesc(625);
	    25:Printesc(628);
	    OTHERS:Printesc(627)
	    END;
	{1058}51:Printstyle(chrcode);
	{1065}50:CASE chrcode OF
	    1:Printesc(877);
	    2:Printesc(878);
	    3:Printesc(631);
	    4:Printesc(879);
	    5:Printesc(879);
	    OTHERS:Printesc(876)
	    END;
	{1074}47:IF chrcode=29 THEN
		     Printesc(629)
		 ELSE
		     Printesc(630);
	{1094}55:CASE chrcode OF
	    1:Printesc(893);
	    2:Printesc(894);
	    3:Printesc(895);
	    4:Printesc(896);
	    5:Printesc(897);
	    6:Printesc(898);
	    7:Printesc(899);
	    8:Printesc(900);
	    9:Printesc(901);
	    OTHERS:Printesc(892)
	    END;
	{1111}80:IF chrcode=1 THEN
		     Printesc(920)
		 ELSE
		     IF chrcode=2 THEN
			 Printesc(
				  921)
		     ELSE
			 Printesc(922);
	82:IF chrcode=0 THEN
	       Printesc(923)
	   ELSE
	       IF chrcode=1 THEN
		   Printesc(924)
	       ELSE
		   IF chrcode=2 THEN
		       Printesc(925)
		   ELSE
		       Printesc(926);
	{1126}76:IF chrcode=2944 THEN
		     Printesc(942)
		 ELSE
		     IF chrcode=3072 THEN
			 Printesc(943)
		     ELSE
			 IF chrcode=3200 THEN
			     Printesc(944)
			 ELSE
			     IF chrcode=3328
			     THEN
				 Printesc(945)
			     ELSE
				 IF chrcode=3456 THEN
				     Printesc(946)
				 ELSE
				     Printesc(
					      947);
	77:Printsize(chrcode-2895);
	{1131}84,85,86,87:BEGIN
	    CASE cmd OF
		84:Printesc(967);
		85:Printesc(968);
		86:Printesc(969);
		OTHERS:Printesc(970)
		END;
	    IF chrcode=0 THEN
		Print(458)
	    ELSE
		IF chrcode=1 THEN
		    Print(459)
		ELSE
		    Print(
			  460);
	    END;
	{1142}90:IF chrcode=1 THEN
		     Printesc(979)
		 ELSE
		     Printesc(978);
	{1152}91:CASE chrcode OF
	    0:Printesc(989);
	    1:Printesc(990);
	    2:Printesc(991);
	    OTHERS:Printesc(992)
	    END;
	{1158}58:IF chrcode=0 THEN
		     Printesc(993)
		 ELSE
		     Printesc(994);
	{1166}54:IF chrcode=3200 THEN
		     Printesc(1000)
		 ELSE
		     Printesc(1001);
	{1171}20:CASE chrcode OF
	    1:Printesc(1003);
	    2:Printesc(1004);
	    3:Printesc(1005);
	    OTHERS:Printesc(1002)
	    END;
	{1174}92:Print(1014);
	94:Print(1015);
	95:Printesc(1016);
	96:Printesc(1017);
	97:Printesc(1018);
	{1225}59:CASE chrcode OF
	    0:Printesc(1049);
	    1:Printesc(1050);
	    2:Printesc(1051);
	    3:Printesc(1052);
	    OTHERS:Print(1053)
	    END;
	OTHERS:Print(378)
	END;
    END;

{290}PROCEDURE Showcontext;
    LABEL
	30;
    VAR
	oldsetting:0..21;
	{294}i:0..bufsize;
	j:0..bufsize;
	l:0..halferrorlin;
	m:integer;
	n:0..errorline;
	p:integer;
	q:integer;
    BEGIN
    baseptr:=inputptr;
    inputstack[baseptr]:=curinput;
    WHILE true DO
	BEGIN
	curinput:=inputstack[baseptr];
	{291}
	IF(curinput.statefield<>0)OR(curinput.indexfield<>3)OR(curinput.
							       locfield<>0)THEN
	    BEGIN
	    tally:=0;
	    oldsetting:=selector;
	    IF curinput.statefield<>0 THEN
		BEGIN{292}
		IF(curinput.namefield=0)THEN
		    IF
		    baseptr=0 THEN
			Printnl(383)
		    ELSE
			Printnl(384)
		ELSE
		    BEGIN
		    Printnl(385);
		    Printint(page);
		    Print(386);
		    Printint(line);
		    END;
		Printchar(32);
		{297}
		BEGIN
		l:=tally;
		tally:=0;
		selector:=20;
		trickcount:=1000000;
		END;
		IF buffer[curinput.limitfield]=13 THEN
		    j:=curinput.limitfield
		ELSE
		    j:=
		    curinput.limitfield+1;
		IF j>0 THEN
		    FOR i:=curinput.startfield TO j-1 DO
			BEGIN
			IF i=curinput.
			locfield THEN
			    BEGIN
			    firstcount:=tally;
			    trickcount:=tally+1+errorline-halferrorlin;
			    IF trickcount<errorline THEN
				trickcount:=errorline;
			    END;
			Print(buffer[i]);
			END;
		END
	    ELSE
		BEGIN{293}
		CASE curinput.indexfield OF
		    0:Printnl(387);
		    1,2:Printnl(388);
		    3:Printnl(389);
		    4:BEGIN
			Println;
			Printcs(curinput.namefield);
			END;
		    5:Printnl(390);
		    6:Printnl(391);
		    7:Printnl(392);
		    8:Printnl(393);
		    OTHERS:Printnl(63)
		    END;
		{298}
		BEGIN
		l:=tally;
		tally:=0;
		selector:=20;
		trickcount:=1000000;
		END;
		IF curinput.indexfield<4 THEN
		    Showtokenlis(curinput.startfield,curinput.
				 locfield,100000)
		ELSE
		    Showtokenlis(mem[curinput.startfield].hh.rh,
				 curinput.locfield,100000);
		END;
	    selector:=oldsetting;
	    {296}
	    IF trickcount=1000000 THEN
		BEGIN
		firstcount:=tally;
		trickcount:=tally+1+errorline-halferrorlin;
		IF trickcount<errorline THEN
		    trickcount:=errorline;
		END;
	    IF tally<trickcount THEN
		m:=tally-firstcount
	    ELSE
		m:=trickcount-
		firstcount;
	    IF l+firstcount<=halferrorlin THEN
		BEGIN
		p:=0;
		n:=l+firstcount;
		END
	    ELSE
		BEGIN
		Print(394);
		p:=l+firstcount-halferrorlin+3;
		n:=halferrorlin;
		END;
	    FOR q:=p TO firstcount-1 DO Printchar(trickbuf[q MOD errorline]);
	    Println;
	    FOR q:=1 TO n DO Printchar(32);
	    IF m+n<=errorline THEN
		p:=firstcount+m
	    ELSE
		p:=firstcount+(errorline-n-3
			       );
	    FOR q:=firstcount TO p-1 DO Printchar(trickbuf[q MOD errorline]);
	    IF m+n>errorline THEN
		Print(394);
	    END;
	IF(curinput.statefield<>0)THEN
	    IF(NOT(curinput.namefield=0))OR(baseptr=0
					    )THEN
		GOTO 30;
	baseptr:=baseptr-1;
	END;
    30:
    curinput:=inputstack[inputptr];
    END;
    {300}
PROCEDURE Pushinput;
    BEGIN
    IF inputptr>maxinstack THEN
	BEGIN
	maxinstack:=inputptr;
	IF inputptr=stacksize THEN
	    Overflow(395,stacksize);
	END;
    inputstack[inputptr]:=curinput;
    inputptr:=inputptr+1;
    END;
    {301}
PROCEDURE Popinput;
    BEGIN
    inputptr:=inputptr-1;
    curinput:=inputstack[inputptr];
    END;
    {302}
PROCEDURE Begintokenli(p:halfword;
		       t:quarterword);
    BEGIN
    Pushinput;
    curinput.statefield:=0;
    curinput.startfield:=p;
    curinput.indexfield:=t;
    IF t>=4 THEN
	BEGIN
	mem[p].hh.lh:=mem[p].hh.lh+1;
	IF t=4 THEN
	    curinput.limitfield:=paramptr
	ELSE
	    curinput.locfield:=mem[p]
	    .hh.rh;
	END
    ELSE
	curinput.locfield:=p;
    END;
    {303}
PROCEDURE Endtokenlist;
    BEGIN
    IF curinput.indexfield>=3 THEN
	BEGIN
	IF curinput.indexfield=3 THEN
	    Flushlist(curinput.startfield)
	ELSE
	    BEGIN
	    Deletetokenr(curinput.
			 startfield);
	    IF curinput.indexfield=4 THEN
		WHILE paramptr>curinput.limitfield DO
		    BEGIN
		    paramptr:=paramptr-1;
		    Flushlist(paramstack[paramptr]);
		    END;
	    END;
	END
    ELSE
	IF curinput.indexfield=1 THEN
	    alignstate:=0;
    Popinput;
    BEGIN
    IF interrupt<>0 THEN
	Pauseforinst;
    END;
    END;
    {304}
PROCEDURE Backinput;
    VAR
	p:halfword;
    BEGIN
    WHILE(curinput.statefield=0)AND(curinput.locfield=0)DO
	Endtokenlist;
    p:=Getavail;
    mem[p].hh.lh:=curtok;
    IF curtok<768 THEN
	IF curtok<512 THEN
	    alignstate:=alignstate-1
	ELSE
	    alignstate:=alignstate+1;
    Begintokenli(p,3);
    END;
    {305}
PROCEDURE Backerror;
    BEGIN
    Backinput;
    Error;
    END;
    {306}
PROCEDURE Beginfilerea;
    BEGIN
    IF inopen=maxinopen THEN
	Overflow(396,maxinopen);
    IF first=bufsize THEN
	Overflow(128,bufsize);
    inopen:=inopen+1;
    Pushinput;
    curinput.indexfield:=inopen;
    linestack[curinput.indexfield]:=line;
    curinput.startfield:=first;
    curinput.statefield:=1;
    curinput.namefield:=0;
    pagestack[curinput.indexfield]:=page;
    END;
    {307}
PROCEDURE Endfilereadi;
    BEGIN
    first:=curinput.startfield;
    page:=pagestack[curinput.indexfield];
    line:=linestack[curinput.indexfield];
    IF NOT(curinput.namefield=0)THEN
	Aclose(inputfile[curinput.indexfield]);
    Popinput;
    inopen:=inopen-1;
    END;
    {308}
PROCEDURE Clearforerro;
    BEGIN
    WHILE(curinput.statefield<>0)AND(curinput.namefield=0)AND(inputptr
    >0)AND(curinput.locfield>curinput.limitfield)DO Endfilereadi;
    Println;
    breakin(termin,true);
    END;
    {314}
PROCEDURE Checkouterva;
    VAR
	p:halfword;
	q:halfword;
    BEGIN
    IF scannerstatu<>0 THEN
	IF scannerstatu>1 THEN
	    {315}
	    BEGIN
	    Runaway;
	    IF csptr=0 THEN
		Printnl(402)
	    ELSE
		BEGIN
		p:=Getavail;
		mem[p].hh.lh:=4096+csptr;
		Begintokenli(p,3);
		csptr:=0;
		curcmd:=10;
		curchr:=32;
		Printnl(403);
		END;
	    Print(404);
	    {316}p:=Getavail;
	    CASE scannerstatu OF
		2:BEGIN
		    Print(410);
		    mem[p].hh.lh:=637;
		    END;
		3:BEGIN
		    Print(411);
		    mem[p].hh.lh:=partoken;
		    longstate:=96;
		    END;
		4:BEGIN
		    Print(412);
		    mem[p].hh.lh:=637;
		    q:=p;
		    p:=Getavail;
		    mem[p].hh.rh:=q;
		    mem[p].hh.lh:=6453;
		    END;
		END;
	    Begintokenli(p,3);
	    Print(405);
	    Sprintcs(warningindex);
	    BEGIN
	    helpptr:=4;
	    helpline[3]:=406;
	    helpline[2]:=407;
	    helpline[1]:=408;
	    helpline[0]:=409;
	    END;
	    deletionsall:=false;
	    Error;
	    deletionsall:=true;
	    END
	ELSE
	    IF csptr=0 THEN
		BEGIN
		Printnl(398);
		BEGIN
		helpptr:=3;
		helpline[2]:=399;
		helpline[1]:=400;
		helpline[0]:=401;
		END;
		Error;
		END;
    END;
    {317}
PROCEDURE Openlogfile;
    FORWARD;
PROCEDURE Firmupthelin;
    FORWARD;
    {318}
PROCEDURE Getnext;
    LABEL
	20,25,21,26,40;
    VAR
	k:0..bufsize;
	t:halfword;
    BEGIN
    20:
    csptr:=0;
    IF curinput.statefield<>0 THEN
	{320}
	BEGIN
    25:
	IF curinput.locfield<=
	curinput.limitfield THEN
	    BEGIN
	    curchr:=buffer[curinput.locfield];
	    curinput.locfield:=curinput.locfield+1;
    21:
	    curcmd:=eqtb[2944+curchr].hh.rh;
	    {321}
	    CASE curinput.statefield+curcmd OF
		{322}10,26,42,27,43:GOTO 25;
		1,17,33:{331}BEGIN
		    IF curinput.locfield>curinput.limitfield THEN
			csptr:=
			1
		    ELSE
			BEGIN
    26:
			k:=curinput.locfield;
			curchr:=buffer[k];
			k:=k+1;
			IF(eqtb[2944+curchr].hh.rh=11)AND(k<=curinput.limitfield)THEN
			    {333}
			    BEGIN
			    REPEAT
				curchr:=buffer[k];
				k:=k+1;
			    UNTIL(eqtb[2944+curchr].hh.rh<>11)OR(k>curinput.limitfield);
			    {332}
			    BEGIN
			    IF(buffer[k]=curchr)AND(eqtb[2944+curchr].hh.rh=7)AND(k<
										  curinput.limitfield)THEN
				BEGIN
				curchr:=buffer[k+1];
				IF(curchr<=95)AND(curchr>=63)THEN
				    BEGIN
				    IF curchr>63 THEN
					buffer[k-1]:=
					curchr-64
				    ELSE
					buffer[k-1]:=127;
				    curinput.limitfield:=curinput.limitfield-2;
				    first:=first-2;
				    WHILE k<=curinput.limitfield DO
					BEGIN
					buffer[k]:=buffer[k+2];
					k:=k+1;
					END;
				    GOTO 26;
				    END;
				END;
			    END;
			    IF eqtb[2944+buffer[k-1]].hh.rh<>11 THEN
				k:=k-1;
			    IF k>curinput.locfield+1 THEN
				BEGIN
				csptr:=Idlookup(curinput.locfield,k-
						curinput.locfield);
				curinput.locfield:=k;
				GOTO 40;
				END;
			    END
			ELSE
			    {332}
			    BEGIN
			    IF(buffer[k]=curchr)AND(eqtb[2944+curchr].hh.rh=7)AND
				(k<curinput.limitfield)THEN
				BEGIN
				curchr:=buffer[k+1];
				IF(curchr<=95)AND(curchr>=63)THEN
				    BEGIN
				    IF curchr>63 THEN
					buffer[k-1]:=
					curchr-64
				    ELSE
					buffer[k-1]:=127;
				    curinput.limitfield:=curinput.limitfield-2;
				    first:=first-2;
				    WHILE k<=curinput.limitfield DO
					BEGIN
					buffer[k]:=buffer[k+2];
					k:=k+1;
					END;
				    GOTO 26;
				    END;
				END;
			    END;
			csptr:=1+buffer[curinput.locfield];
			curinput.locfield:=curinput.locfield+1;
			END;
    40:
		    curcmd:=eqtb[csptr].hh.b0;
		    curchr:=eqtb[csptr].hh.rh;
		    curinput.statefield:=17;
		    IF curcmd>=96 THEN
			Checkouterva;
		    END;
		14,30,46:{330}BEGIN
		    csptr:=curchr+129;
		    curcmd:=eqtb[csptr].hh.b0;
		    curchr:=eqtb[csptr].hh.rh;
		    curinput.statefield:=1;
		    IF curcmd>=96 THEN
			Checkouterva;
		    END;
		8,24,40:{329}BEGIN
		    IF(curchr=buffer[curinput.locfield])AND(curinput.
							    locfield<curinput.limitfield)THEN
			IF(buffer[curinput.locfield+1]<=95)AND
			    (buffer[curinput.locfield+1]>=63)THEN
			    BEGIN
			    IF buffer[curinput.locfield
				      +1]=63 THEN
				curchr:=127
			    ELSE
				curchr:=buffer[curinput.locfield+1]-64;
			    curinput.locfield:=curinput.locfield+2;
			    GOTO 21;
			    END;
		    curinput.statefield:=1;
		    END;
		16,32,48:{323}BEGIN
		    Printnl(413);
		    BEGIN
		    helpptr:=2;
		    helpline[1]:=414;
		    helpline[0]:=415;
		    END;
		    deletionsall:=false;
		    Error;
		    deletionsall:=true;
		    GOTO 25;
		    END;
		{324}11:{326}BEGIN
		    curinput.statefield:=17;
		    curchr:=32;
		    END;
		6:{325}BEGIN
		    curinput.statefield:=33;
		    curinput.locfield:=curinput.limitfield+1;
		    curcmd:=10;
		    curchr:=32;
		    END;
		22,15,31,47:{327}BEGIN
		    curinput.statefield:=33;
		    curinput.locfield:=curinput.limitfield+1;
		    GOTO 25;
		    END;
		38:{328}BEGIN
		    curinput.locfield:=curinput.limitfield+1;
		    csptr:=parloc;
		    curcmd:=eqtb[csptr].hh.b0;
		    curchr:=eqtb[csptr].hh.rh;
		    IF curcmd>=96 THEN
			Checkouterva;
		    END;
		2:alignstate:=alignstate+1;
		18,34:BEGIN
		    curinput.statefield:=1;
		    alignstate:=alignstate+1;
		    END;
		3:alignstate:=alignstate-1;
		19,35:BEGIN
		    curinput.statefield:=1;
		    alignstate:=alignstate-1;
		    END;
		20,21,23,25,28,29,36,37,39,41,44,45:curinput.statefield:=1;
		OTHERS:
		END;
	    END
	ELSE
	    BEGIN{336}
	    IF NOT(curinput.namefield=0)THEN
		{337}
		BEGIN
		line:=line
		+1;
		first:=curinput.startfield;
		IF Inputln(inputfile[curinput.indexfield])THEN
		    Firmupthelin
		ELSE
		    IF
		    curinput.limitfield<>curinput.startfield THEN
			curinput.limitfield:=
			curinput.startfield
		    ELSE
			BEGIN
			Checkouterva;
			Printchar(41);
			Break(termout);
			Endfilereadi;
			GOTO 20;
			END;
		buffer[curinput.limitfield]:=13;
		first:=curinput.limitfield+1;
		curinput.locfield:=curinput.startfield;
		END
	    ELSE
		BEGIN
		IF inputptr>0 THEN
		    BEGIN
		    Endfilereadi;
		    GOTO 20;
		    END;
		IF selector<18 THEN
		    Openlogfile;
		IF interaction>1 THEN
		    BEGIN
		    IF curinput.limitfield=curinput.startfield
		    THEN
			Printnl(416);
		    Println;
		    first:=curinput.startfield;
		    BEGIN
		    Print(42);
		    Terminput;
		    END;
		    curinput.limitfield:=last;
		    buffer[curinput.limitfield]:=13;
		    first:=last+1;
		    curinput.locfield:=curinput.startfield;
		    END
		ELSE
		    Fatalerror(417);
		END;
	    BEGIN
	    IF interrupt<>0 THEN
		Pauseforinst;
	    END;
	    GOTO 25;
	    END;
	END
    ELSE
	{334}
	IF curinput.locfield<>0 THEN
	    BEGIN
	    t:=mem[curinput.locfield
		   ].hh.lh;
	    curinput.locfield:=mem[curinput.locfield].hh.rh;
	    IF t>=4096 THEN
		BEGIN
		csptr:=t-4096;
		curcmd:=eqtb[csptr].hh.b0;
		curchr:=eqtb[csptr].hh.rh;
		IF curcmd>=96 THEN
		    Checkouterva;
		END
	    ELSE
		BEGIN
		curcmd:=t DIV 256;
		curchr:=t MOD 256;
		CASE curcmd OF
		    1:alignstate:=alignstate+1;
		    2:alignstate:=alignstate-1;
		    5:{335}BEGIN
			Begintokenli(paramstack[curinput.limitfield+curchr-1],0);
			GOTO 20;
			END;
		    OTHERS:
		    END;
		END;
	    END
	ELSE
	    BEGIN
	    Endtokenlist;
	    GOTO 20;
	    END;
    IF{319}(alignstate=0)AND(curcmd<=5)AND(curcmd>=4)THEN
	{688}
	BEGIN
	curcmd:=
	mem[curalign+5].hh.lh;
	mem[curalign+5].hh.lh:=curchr;
	IF curcmd=62 THEN
	    Begintokenli(10010,2)
	ELSE
	    Begintokenli(mem[curalign+2]
			 .int,2);
	alignstate:=1000000;
	GOTO 20;
	END;
    END;

{338}PROCEDURE Firmupthelin;
    VAR
	k:0..bufsize;
    BEGIN
    curinput.limitfield:=last;
    IF(eqtb[3611].int<>0)AND(interaction>1)AND(buffer[curinput.startfield]<>
					       12)THEN
	BEGIN
	Println;
	IF curinput.startfield=curinput.limitfield THEN
	    BEGIN
	    buffer[curinput.
		   startfield]:=32;
	    curinput.limitfield:=curinput.limitfield+1;
	    END;
	selector:=selector-1;
	FOR k:=curinput.startfield TO curinput.limitfield-1 DO
	    BEGIN
	    Printchar(
		      buffer[k]);
	    Ptldch(xchr[buffer[k]]);
	    END;
	Print(418);
	Ptldbk(137);
	Ptldln;
	first:=curinput.startfield;
	IF NOT Inputln(termin)THEN
	    Fatalerror(133);
	IF last>first THEN
	    FOR k:=first TO last-1 DO Printchar(buffer[k]);
	curinput.limitfield:=last;
	Println;
	selector:=selector+1;
	END;
    END;
    {340}
PROCEDURE Gettoken;
    BEGIN
    nonewcontrol:=false;
    Getnext;
    nonewcontrol:=true;
    IF csptr=0 THEN
	BEGIN
	IF curcmd=9 THEN
	    Fatalerror(419);
	curtok:=(curcmd*256)+curchr;
	END
    ELSE
	curtok:=4096+csptr;
    END;
    {341}{351}
PROCEDURE Macrocall;
    LABEL
	10,22,30,31,40;
    VAR
	r:halfword;
	p:halfword;
	q:halfword;
	s:halfword;
	t:halfword;
	u,v:halfword;
	rbraceptr:halfword;
	n:smallnumber;
	unbalance:halfword;
	m:halfword;
	refcount:halfword;
	savescanners:smallnumber;
	savewarningi:halfword;
    BEGIN
    savescanners:=scannerstatu;
    savewarningi:=warningindex;
    warningindex:=csptr;
    refcount:=curchr;
    r:=mem[refcount].hh.rh;
    n:=0;
    IF eqtb[3613].int<>0 THEN
	{363}
	BEGIN
	Begindiagnos;
	Println;
	Printcs(warningindex);
	Tokenshow(refcount);
	Enddiagnosti(false);
	END;
    IF mem[r].hh.lh<>3584 THEN
	{354}
	BEGIN
	scannerstatu:=3;
	unbalance:=0;
	longstate:=eqtb[csptr].hh.b0;
	IF longstate>=96 THEN
	    longstate:=longstate-2;
	REPEAT
	    IF(mem[r].hh.lh>3583)OR(mem[r].hh.lh<3328)THEN
		s:=0
	    ELSE
		BEGIN
		s
		:=mem[r].hh.rh;
		r:=s;
		p:=10003;
		mem[p].hh.rh:=0;
		m:=0;
		END;
    {355}22:
	    Gettoken;
	    IF curtok=mem[r].hh.lh THEN
		{356}
		BEGIN
		r:=mem[r].hh.rh;
		IF(mem[r].hh.lh>=3328)AND(mem[r].hh.lh<=3584)THEN
		    BEGIN
		    IF curtok<512
		    THEN
			alignstate:=alignstate-1;
		    GOTO 40;
		    END
		ELSE
		    GOTO 22;
		END;
	    {359}
	    IF s<>r THEN
		IF s=0 THEN
		    {360}
		    BEGIN
		    Printnl(444);
		    Sprintcs(warningindex);
		    Print(445);
		    BEGIN
		    helpptr:=4;
		    helpline[3]:=446;
		    helpline[2]:=447;
		    helpline[1]:=448;
		    helpline[0]:=449;
		    END;
		    Error;
		    GOTO 10;
		    END
		ELSE
		    BEGIN
		    t:=s;
		    REPEAT
			BEGIN
			q:=Getavail;
			mem[p].hh.rh:=q;
			mem[q].hh.lh:=mem[t].hh.lh;
			p:=q;
			END;
			m:=m+1;
			u:=mem[t].hh.rh;
			v:=s;
			WHILE true DO
			    BEGIN
			    IF u=r THEN
				IF curtok<>mem[v].hh.lh THEN
				    GOTO 30
				ELSE
				    BEGIN
				    r:=mem[v].hh.rh;
				    GOTO 22;
				    END;
			    IF mem[u].hh.lh<>mem[v].hh.lh THEN
				GOTO 30;
			    u:=mem[u].hh.rh;
			    v:=mem[v].hh.rh;
			    END;
    30:
			t:=mem[t].hh.rh;
		    UNTIL t=r;
		    END;
	    IF(curtok=partoken)AND(longstate<>95)THEN
		{358}
		BEGIN
		IF longstate=94 THEN
		    BEGIN
		    Runaway;
		    Printnl(439);
		    Sprintcs(warningindex);
		    Print(440);
		    BEGIN
		    helpptr:=3;
		    helpline[2]:=441;
		    helpline[1]:=442;
		    helpline[0]:=443;
		    END;
		    Backerror;
		    END;
		pstack[n]:=mem[10003].hh.rh;
		alignstate:=alignstate-unbalance;
		FOR m:=0 TO n DO Flushlist(pstack[m]);
		GOTO 10;
		END;
	    IF curtok<768 THEN
		IF curtok<512 THEN
		    {361}
		    BEGIN
		    unbalance:=1;
		    WHILE true DO
			BEGIN
			BEGIN
			q:=Getavail;
			mem[p].hh.rh:=q;
			mem[q].hh.lh:=curtok;
			p:=q;
			END;
			Gettoken;
			IF(curtok=partoken)AND(longstate<>95)THEN
			    {358}
			    BEGIN
			    IF longstate=94 THEN
				BEGIN
				Runaway;
				Printnl(439);
				Sprintcs(warningindex);
				Print(440);
				BEGIN
				helpptr:=3;
				helpline[2]:=441;
				helpline[1]:=442;
				helpline[0]:=443;
				END;
				Backerror;
				END;
			    pstack[n]:=mem[10003].hh.rh;
			    alignstate:=alignstate-unbalance;
			    FOR m:=0 TO n DO Flushlist(pstack[m]);
			    GOTO 10;
			    END;
			IF curtok<768 THEN
			    IF curtok<512 THEN
				unbalance:=unbalance+1
			    ELSE
				BEGIN
				unbalance:=unbalance-1;
				IF unbalance=0 THEN
				    GOTO 31;
				END;
			END;
    31:
		    rbraceptr:=p;
		    BEGIN
		    q:=Getavail;
		    mem[p].hh.rh:=q;
		    mem[q].hh.lh:=curtok;
		    p:=q;
		    END;
		    END
		ELSE
		    {357}
		    BEGIN
		    Printnl(432);
		    Sprintcs(warningindex);
		    Print(433);
		    BEGIN
		    helpptr:=5;
		    helpline[4]:=434;
		    helpline[3]:=435;
		    helpline[2]:=436;
		    helpline[1]:=437;
		    helpline[0]:=438;
		    END;
		    alignstate:=alignstate+1;
		    longstate:=94;
		    Error;
		    END
	    ELSE
		BEGIN
		q:=Getavail;
		mem[p].hh.rh:=q;
		mem[q].hh.lh:=curtok;
		p:=q;
		END;
	    m:=m+1;
	    IF(mem[r].hh.lh<3328)OR(mem[r].hh.lh>3584)THEN
		GOTO 22;
    40:
	    IF s<>0 THEN
		{362}
		BEGIN
		IF(m=1)AND(mem[p].hh.lh<768)AND(p<>10003)THEN
		    BEGIN
		    mem[rbraceptr].hh.rh:=0;
		    BEGIN
		    mem[p].hh.rh:=avail;
		    avail:=p;
		    dynused:=dynused-1;
		    END;
		    p:=mem[10003].hh.rh;
		    pstack[n]:=mem[p].hh.rh;
		    BEGIN
		    mem[p].hh.rh:=avail;
		    avail:=p;
		    dynused:=dynused-1;
		    END;
		    END
		ELSE
		    pstack[n]:=mem[10003].hh.rh;
		n:=n+1;
		IF eqtb[3613].int<>0 THEN
		    BEGIN
		    Begindiagnos;
		    Printnl(35);
		    Printint(n);
		    Print(450);
		    Showtokenlis(pstack[n-1],0,1000);
		    Enddiagnosti(false);
		    END;
		END;
	UNTIL mem[r].hh.lh=3584;
	END;
    {352}
    WHILE(curinput.statefield=0)AND(curinput.locfield=0)DO Endtokenlist
	;
    Begintokenli(refcount,4);
    curinput.namefield:=warningindex;
    curinput.locfield:=mem[r].hh.rh;
    IF n>0 THEN
	BEGIN
	IF paramptr+n>maxparamstac THEN
	    BEGIN
	    maxparamstac:=
	    paramptr+n;
	    IF maxparamstac>paramsize THEN
		Overflow(431,paramsize);
	    END;
	FOR m:=0 TO n-1 DO paramstack[paramptr+m]:=pstack[m];
	paramptr:=paramptr+n;
	END;
    10:
    scannerstatu:=savescanners;
    warningindex:=savewarningi;
    END;
PROCEDURE Getnctoken;
    LABEL
	30;
    BEGIN
    WHILE true DO
	BEGIN
	Getnext;
	IF curcmd<=91 THEN
	    GOTO 30;
	IF curcmd>=94 THEN
	    Macrocall
	ELSE
	    IF curcmd=93 THEN
		{348}
		BEGIN
		IF curmark
		    [curchr]<>0 THEN
		    Begintokenli(curmark[curchr],7);
		END
	    ELSE
		{342}
		BEGIN
		Printnl(420);
		BEGIN
		helpptr:=5;
		helpline[4]:=421;
		helpline[3]:=422;
		helpline[2]:=423;
		helpline[1]:=424;
		helpline[0]:=425;
		END;
		Error;
		END;
	END;
    30:
    IF csptr=0 THEN
	curtok:=(curcmd*256)+curchr
    ELSE
	curtok:=4096+csptr;
    END;
    {343}
PROCEDURE Nctoken;
    LABEL
	30;
    BEGIN
    WHILE true DO
	BEGIN
	IF curcmd<=91 THEN
	    GOTO 30;
	IF curcmd>=94 THEN
	    Macrocall
	ELSE
	    IF curcmd=93 THEN
		{348}
		BEGIN
		IF curmark
		    [curchr]<>0 THEN
		    Begintokenli(curmark[curchr],7);
		END
	    ELSE
		{342}
		BEGIN
		Printnl(420);
		BEGIN
		helpptr:=5;
		helpline[4]:=421;
		helpline[3]:=422;
		helpline[2]:=423;
		helpline[1]:=424;
		helpline[0]:=425;
		END;
		Error;
		END;
	Getnext;
	END;
    30:
    IF csptr=0 THEN
	curtok:=(curcmd*256)+curchr
    ELSE
	curtok:=4096+csptr;
    END;
    {365}
PROCEDURE Scanleftbrac;
    BEGIN{366}
    REPEAT
	Getnctoken;
    UNTIL curcmd<>10;
    IF curcmd<>1 THEN
	BEGIN
	Printnl(451);
	BEGIN
	helpptr:=4;
	helpline[3]:=452;
	helpline[2]:=453;
	helpline[1]:=454;
	helpline[0]:=455;
	END;
	Backerror;
	curtok:=379;
	curcmd:=1;
	curchr:=123;
	alignstate:=alignstate+1;
	END;
    END;
    {367}
PROCEDURE Scanoptional;
    BEGIN{366}
    REPEAT
	Getnctoken;
    UNTIL curcmd<>10;
    IF curtok<>3133 THEN
	Backinput;
    END;
    {368}
PROCEDURE Passblock(l:integer);
    LABEL
	30;
    BEGIN
    scannerstatu:=1;
    WHILE true DO
	BEGIN
	Gettoken;
	IF curcmd=2 THEN
	    BEGIN
	    l:=l-1;
	    IF l<=0 THEN
		GOTO 30;
	    END
	ELSE
	    IF curcmd=1 THEN
		l:=l+1;
	END;
    30:
    IF l<0 THEN
	BEGIN
	alignstate:=alignstate+1;
	Printnl(451);
	BEGIN
	helpptr:=2;
	helpline[1]:=456;
	helpline[0]:=457;
	END;
	Error;
	END;
    scannerstatu:=0;
    {369}
    BEGIN
    Getnctoken;
    IF curcmd<>10 THEN
	Backinput;
    END;
    END;

{370}FUNCTION Scankeyword(s:strnumber):boolean;
    LABEL
	10;
    VAR
	p:halfword;
	q:halfword;
	k:poolpointer;
    BEGIN
    p:=10011;
    mem[p].hh.rh:=0;
    k:=strstart[s];
    WHILE k<strstart[s+1]DO
	BEGIN
	Getnctoken;
	IF(curcmd=11)AND((curchr=strpool[k])OR(curchr=strpool[k]-32))THEN
	    BEGIN
	    BEGIN
	    q:=Getavail;
	    mem[p].hh.rh:=q;
	    mem[q].hh.lh:=curtok;
	    p:=q;
	    END;
	    k:=k+1
	    END
	ELSE
	    BEGIN
	    Backinput;
	    IF p<>10011 THEN
		Begintokenli(mem[10011].hh.rh,3);
	    Scankeyword:=false;
	    GOTO 10;
	    END;
	END;
    Flushlist(mem[10011].hh.rh);
    Scankeyword:=true;
    10:
    END;
    {371}
PROCEDURE Scanint;
    FORWARD;
    {388}
PROCEDURE Scansevenbit;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>127)THEN
	BEGIN
	Printnl(473);
	BEGIN
	helpptr:=2;
	helpline[1]:=474;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {389}
PROCEDURE Scaneightbit;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>255)THEN
	BEGIN
	Printnl(476);
	BEGIN
	helpptr:=2;
	helpline[1]:=477;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {390}
PROCEDURE Scanfourbiti;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>15)THEN
	BEGIN
	Printnl(478);
	BEGIN
	helpptr:=2;
	helpline[1]:=479;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {391}
PROCEDURE Scancharnum;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>255)THEN
	BEGIN
	Printnl(480);
	BEGIN
	helpptr:=2;
	helpline[1]:=481;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {392}
PROCEDURE Scanfifteenb;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>32767)THEN
	BEGIN
	Printnl(482);
	BEGIN
	helpptr:=2;
	helpline[1]:=483;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {393}
PROCEDURE Scantwentyse;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>134217727)THEN
	BEGIN
	Printnl(484);
	BEGIN
	helpptr:=2;
	helpline[1]:=485;
	helpline[0]:=475;
	END;
	Interror(curval);
	curval:=0;
	END;
    END;
    {494}
PROCEDURE Scanfontnumb;
    VAR
	f:internalfont;
    BEGIN
    Scanint;
    IF(curval<0)OR(curval>=badfontcode)THEN
	f:=0
    ELSE
	f:=fontnumber[curval];
    IF f=0 THEN
	BEGIN
	Printnl(575);
	BEGIN
	helpptr:=3;
	helpline[2]:=576;
	helpline[1]:=577;
	helpline[0]:=578;
	END;
	Interror(curval);
	END;
    curval:=f;
    END;
    {495}
PROCEDURE Scantexinfo(writing:boolean);
    VAR
	f:internalfont;
    BEGIN
    Scanfontnumb;
    f:=curval;
    Scanint;
    IF f=0 THEN
	curval:=fmemptr
    ELSE
	BEGIN
	IF curval<=0 THEN
	    curval:=fmemptr
	ELSE
	    BEGIN
	    IF writing AND(curval<=4)AND(curval>=2)AND(fontglue[f]<>0)
	    THEN
		BEGIN
		Deletegluere(fontglue[f]);
		fontglue[f]:=0;
		END;
	    IF curval>fontparams[f]THEN
		IF f<fontptr THEN
		    curval:=fmemptr
		ELSE
		    {497}
		    BEGIN
		    REPEAT
			IF fmemptr=fontmemsize THEN
			    Overflow(583,fontmemsize);
			fontinfo[fmemptr].int:=0;
			fmemptr:=fmemptr+1;
			fontparams[f]:=fontparams[f]+1;
		    UNTIL curval=fontparams[f];
		    curval:=fmemptr-1;
		    END
	    ELSE
		curval:=curval+parambase[f];
	    END;
	{496}
	IF curval=fmemptr THEN
	    BEGIN
	    Printnl(561);
	    Printint(fontcode[f]);
	    Print(579);
	    Printint(fontparams[f]);
	    Print(580);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=581;
	    helpline[0]:=582;
	    END;
	    Error;
	    END;
	END;
    END;
    {375}
PROCEDURE Scanthe(level:smallnumber;
		  negative:boolean);
    LABEL
	20;
    VAR
	m:halfword;
    BEGIN
    20:
    Getnctoken;
    m:=curchr;
    CASE curcmd OF
	76:{376}BEGIN
	    Scansevenbit;
	    IF m<3878 THEN
		BEGIN
		curval:=eqtb[m+curval].hh.rh;
		curvallevel:=0;
		END
	    ELSE
		BEGIN
		curval:=eqtb[m+curval].int;
		curvallevel:=0;
		END;
	    END;
	70:{377}IF(level<>4)OR negative THEN
		    BEGIN
		    Printnl(464);
		    BEGIN
		    helpptr:=1;
		    helpline[0]:=465;
		    END;
		    Backerror;
		    BEGIN
		    curval:=0;
		    curvallevel:=1;
		    END;
		    END
		ELSE
		    BEGIN
		    curval:=eqtb[m].hh.rh;
		    curvallevel:=4;
		    END;
	71:BEGIN
	    curval:=eqtb[3584+m].int;
	    curvallevel:=0;
	    END;
	72,75:BEGIN
	    curval:=eqtb[4006+m].int;
	    curvallevel:=1;
	    END;
	73:IF m>=eqtb[2376].hh.rh THEN
	       BEGIN
	       curval:=eqtb[2362+m].hh.rh;
	       curvallevel:=3;
	       END
	   ELSE
	       BEGIN
	       curval:=eqtb[2362+m].hh.rh;
	       curvallevel:=2;
	       END;
	69:{380}IF Abs(curlist.modefield)<>m THEN
		    BEGIN
		    Printnl(464);
		    BEGIN
		    helpptr:=4;
		    helpline[3]:=468;
		    helpline[2]:=469;
		    helpline[1]:=470;
		    helpline[0]:=465;
		    END;
		    Backerror;
		    BEGIN
		    curval:=0;
		    curvallevel:=1;
		    END;
		    END
		ELSE
		    BEGIN
		    curval:=curlist.auxfield;
		    IF m=1 THEN
			curvallevel:=1
		    ELSE
			curvallevel:=0;
		    END;
	79:BEGIN
	    curval:=eqtb[2943].hh.rh;
	    curvallevel:=0;
	    END;
	74:{382}BEGIN
	    Scantexinfo(false);
	    fontinfo[fmemptr].int:=0;
	    BEGIN
	    curval:=fontinfo[curval].int;
	    curvallevel:=1;
	    END;
	    END;
	67:{383}BEGIN
	    Scaneightbit;
	    CASE m OF
		0:curval:=eqtb[3622+curval].int;
		1:curval:=eqtb[4024+curval].int;
		2:curval:=eqtb[2379+curval].hh.rh;
		END;
	    curvallevel:=m;
	    END;
	68:{381}BEGIN
	    curval:=0;
	    IF NOT(curlist.tailfield>10000)AND(curlist.modefield<>0)THEN
		BEGIN
		IF
		    mem[curlist.tailfield].hh.b0=10 THEN
		    curval:=mem[curlist.tailfield+1].hh
		    .lh;
		END
	    ELSE
		IF(curlist.modefield=1)AND(curlist.tailfield=curlist.headfield)
		    AND(lastpageglue<>65535)THEN
		    curval:=lastpageglue;
	    curvallevel:=2;
	    END;
	78:BEGIN
	    curval:=fontcode[eqtb[2894].hh.rh];
	    curvallevel:=0;
	    END;
	77:{384}BEGIN
	    Scanfourbiti;
	    BEGIN
	    curval:=fontcode[eqtb[m+curval].hh.rh];
	    curvallevel:=0;
	    END;
	    END;
	66:BEGIN
	    IF m>0 THEN
		negative:=NOT negative;
	    GOTO 20;
	    END;
	OTHERS:{385}BEGIN
	    Printnl(471);
	    Printcmdchr(curcmd,curchr);
	    Print(472);
	    BEGIN
	    helpptr:=1;
	    helpline[0]:=465;
	    END;
	    Backerror;
	    BEGIN
	    curval:=0;
	    curvallevel:=1;
	    END;
	    END
	END;
    WHILE curvallevel>level DO{386}
	BEGIN
	IF curvallevel=2 THEN
	    curval:=mem[
			curval+1].int;
	curvallevel:=curvallevel-1;
	END;
    {387}
    IF negative THEN
	IF curvallevel>=2 THEN
	    BEGIN
	    curval:=Newspec(
			    curval);
	    {417}
	    BEGIN
	    mem[curval+1].int:=-mem[curval+1].int;
	    mem[curval+2].int:=-mem[curval+2].int;
	    mem[curval+3].int:=-mem[curval+3].int;
	    END;
	    END
	ELSE
	    curval:=-curval
    ELSE
	IF(curvallevel>=2)AND(curvallevel<>4)THEN
	    mem[curval].hh.rh:=mem[curval].hh.rh+1;
    END;
    {395}
PROCEDURE Scanint;
    LABEL
	30;
    VAR
	negative:boolean;
	m:integer;
	d:smallnumber;
	vacuous:boolean;
	oksofar:boolean;
    BEGIN
    radix:=0;
    oksofar:=true;
    {396}negative:=false;
    REPEAT{366}
	REPEAT
	    Getnctoken;
	UNTIL curcmd<>10;
	IF curtok=3117 THEN
	    BEGIN
	    negative:=NOT negative;
	    curtok:=3115;
	    END;
    UNTIL curtok<>3115;
    IF curtok=3168 THEN
	{397}
	BEGIN
	Gettoken;
	IF curtok<4096 THEN
	    curval:=curchr
	ELSE
	    IF curtok<4225 THEN
		curval:=
		curtok-4097
	    ELSE
		curval:=curtok-4225;
	IF curval>127 THEN
	    BEGIN
	    Printnl(486);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=487;
	    helpline[0]:=488;
	    END;
	    curval:=48;
	    Backerror;
	    END
	ELSE
	    {369}
	    BEGIN
	    Getnctoken;
	    IF curcmd<>10 THEN
		Backinput;
	    END;
	END
    ELSE
	IF(curcmd=66)OR(curcmd=67)THEN
	    {398}
	    BEGIN
	    IF curcmd=67 THEN
		Backinput
	    ELSE
		IF curchr<>0 THEN
		    negative:=NOT negative;
	    Scanthe(0,false);
	    END
	ELSE
	    {399}
	    BEGIN
	    radix:=10;
	    m:=214748364;
	    IF curtok=3111 THEN
		BEGIN
		radix:=8;
		m:=268435456;
		Getnctoken;
		END
	    ELSE
		IF curtok=3106 THEN
		    BEGIN
		    radix:=16;
		    m:=134217728;
		    Getnctoken;
		    END;
	    vacuous:=true;
	    curval:=0;
	    {400}
	    WHILE true DO
		BEGIN
		IF(curtok<3120+radix)AND(curtok>=3120)AND(
							  curtok<=3129)THEN
		    d:=curtok-3120
		ELSE
		    IF(radix=16)AND(curtok<=2886)AND(
						     curtok>=2881)THEN
			d:=curtok-2871
		    ELSE
			GOTO 30;
		vacuous:=false;
		IF(curval>=m)AND((curval>m)OR(d>7)OR(radix<>10))THEN
		    BEGIN
		    IF oksofar
		    THEN
			BEGIN
			Printnl(489);
			BEGIN
			helpptr:=2;
			helpline[1]:=490;
			helpline[0]:=491;
			END;
			Error;
			curval:=2147483647;
			oksofar:=false;
			END;
		    END
		ELSE
		    curval:=curval*radix+d;
		Getnctoken;
		END;
    30:;
	    IF vacuous THEN
		{401}
		BEGIN
		Printnl(492);
		BEGIN
		helpptr:=3;
		helpline[2]:=493;
		helpline[1]:=494;
		helpline[0]:=495;
		END;
		Error;
		END;
	    IF curcmd<>10 THEN
		Backinput;
	    END;
    IF negative THEN
	curval:=-curval;
    END;

{403}PROCEDURE Scandimen(mu,inf,shortcut:boolean);
    LABEL
	30,40,45,88,89;
    VAR
	negative:boolean;
	f:integer;
	{405}num,denom:1..65536;
	k:smallnumber;
	j:smallnumber;
	v:scaled;
	savecurval:scaled;
    BEGIN
    f:=0;
    aritherror:=false;
    curorder:=0;
    negative:=false;
    IF NOT shortcut THEN
	BEGIN{396}
	negative:=false;
	REPEAT{366}
	    REPEAT
		Getnctoken;
	    UNTIL curcmd<>10;
	    IF curtok=3117 THEN
		BEGIN
		negative:=NOT negative;
		curtok:=3115;
		END;
	UNTIL curtok<>3115;
	IF(curcmd=66)OR(curcmd=67)THEN
	    {404}
	    BEGIN
	    IF curcmd=67 THEN
		Backinput
	    ELSE
		IF curchr<>0 THEN
		    negative:=NOT negative;
	    Scanthe(1,false);
	    IF curvallevel=1 THEN
		GOTO 89;
	    END
	ELSE
	    BEGIN
	    Backinput;
	    IF curtok<>3118 THEN
		Scanint
	    ELSE
		BEGIN
		radix:=10;
		curval:=0;
		END;
	    IF(radix=10)AND(curtok=3118)THEN
		{406}
		BEGIN
		k:=0;
		Gettoken;
		WHILE true DO
		    BEGIN
		    Getnctoken;
		    IF(curtok>3129)OR(curtok<3120)THEN
			GOTO 30;
		    IF k<16 THEN
			BEGIN
			dig[k]:=curtok-3120;
			k:=k+1;
			END;
		    END;
    30:
		f:=Rounddecimal(k);
		IF curcmd<>10 THEN
		    Backinput;
		END;
	    END;
	END;
    IF curval<0 THEN
	BEGIN
	negative:=NOT negative;
	curval:=-curval;
	END;
    {407}
    IF inf THEN
	{408}
	IF Scankeyword(180)THEN
	    BEGIN
	    curorder:=1;
	    WHILE Scankeyword(108)DO
		BEGIN
		IF curorder=3 THEN
		    BEGIN
		    Printnl(498);
		    Print(499);
		    BEGIN
		    helpptr:=1;
		    helpline[0]:=500;
		    END;
		    Error;
		    END
		ELSE
		    curorder:=curorder+1;
		END;
	    GOTO 88;
	    END;
    IF mu THEN
	{409}
	IF Scankeyword(203)THEN
	    GOTO 88
	ELSE
	    BEGIN
	    Printnl(498);
	    Print(501);
	    BEGIN
	    helpptr:=4;
	    helpline[3]:=502;
	    helpline[2]:=503;
	    helpline[1]:=504;
	    helpline[0]:=505;
	    END;
	    Error;
	    GOTO 88;
	    END;
    {410}
    IF Scankeyword(506)THEN
	BEGIN
	v:={475}fontinfo[6+parambase[eqtb[
					  2894].hh.rh]].int;
	GOTO 40;
	END;
    IF Scankeyword(507)THEN
	BEGIN
	v:={476}fontinfo[5+parambase[eqtb[2894].hh
				     .rh]].int;
	GOTO 40;
	END;
    IF Scankeyword(508)THEN
	BEGIN
	v:=eqtb[4008].int;
	GOTO 40;
	END;
    IF Scankeyword(509)THEN
	j:=1
    ELSE
	IF Scankeyword(510)THEN
	    j:=2
	ELSE
	    IF
		Scankeyword(511)THEN
		j:=3
	    ELSE
		GOTO 45;
    savecurval:=curval;
    Scaneightbit;
    IF eqtb[2638+curval].hh.rh=0 THEN
	v:=0
    ELSE
	v:=mem[eqtb[2638+curval].hh.
	       rh+j].int;
    curval:=savecurval;
    40:
    curval:=Nxplusy(curval,v,Xnoverd(v,f,65536));
    GOTO 89;
    45:;
    IF Scankeyword(496)THEN
	{411}
	BEGIN{369}
	BEGIN
	Getnctoken;
	IF curcmd<>10 THEN
	    Backinput;
	END;
	Preparemag;
	IF eqtb[3600].int<>1000 THEN
	    BEGIN
	    curval:=Xnoverd(curval,1000,eqtb[3600
					     ].int);
	    f:=(1000*f+65536*remainder)DIV eqtb[3600].int;
	    curval:=curval+(f DIV 65536);
	    f:=f MOD 65536;
	    END;
	END;
    IF Scankeyword(497)THEN
	GOTO 88;
    {412}
    IF Scankeyword(512)THEN
	BEGIN
	num:=7227;
	denom:=100;
	END
    ELSE
	IF Scankeyword(513)THEN
	    BEGIN
	    num:=12;
	    denom:=1;
	    END
	ELSE
	    IF Scankeyword(514)THEN
		BEGIN
		num:=7227;
		denom:=254;
		END
	    ELSE
		IF Scankeyword(515)THEN
		    BEGIN
		    num:=7227;
		    denom:=2540;
		    END
		ELSE
		    IF Scankeyword(516)THEN
			BEGIN
			num:=7227;
			denom:=7200;
			END
		    ELSE
			IF Scankeyword(517)THEN
			    BEGIN
			    num:=215;
			    denom:=201;
			    END
			ELSE
			    IF Scankeyword(518)THEN
				BEGIN
				num:=2580;
				denom:=201;
				END
			    ELSE
				IF Scankeyword(519)THEN
				    GOTO 89
				ELSE
				    {413}
				    BEGIN
				    Printnl(498);
				    Print(520);
				    BEGIN
				    helpptr:=6;
				    helpline[5]:=521;
				    helpline[4]:=522;
				    helpline[3]:=523;
				    helpline[2]:=503;
				    helpline[1]:=504;
				    helpline[0]:=505;
				    END;
				    Error;
				    GOTO 88;
				    END;
    curval:=Xnoverd(curval,num,denom);
    f:=(num*f+65536*remainder)DIV denom;
    curval:=curval+(f DIV 65536);
    f:=f MOD 65536;
    88:
    IF curval>=16384 THEN
	aritherror:=true
    ELSE
	curval:=curval*65536+f;
    89:
    IF negative THEN
	curval:=-curval;
    IF aritherror OR(Abs(curval)>=1073741824)THEN
	{414}
	BEGIN
	Printnl(524);
	BEGIN
	helpptr:=2;
	helpline[1]:=525;
	helpline[0]:=526;
	END;
	Error;
	curval:=1073741823;
	END;
    {369}
    BEGIN
    Getnctoken;
    IF curcmd<>10 THEN
	Backinput;
    END;
    END;
    {415}
PROCEDURE Scanglue(mu:boolean);
    LABEL
	10;
    VAR
	negative:boolean;
	q:halfword;
    BEGIN{396}
    negative:=false;
    REPEAT{366}
	REPEAT
	    Getnctoken;
	UNTIL curcmd<>10;
	IF curtok=3117 THEN
	    BEGIN
	    negative:=NOT negative;
	    curtok:=3115;
	    END;
    UNTIL curtok<>3115;
    IF(curcmd=66)OR(curcmd=67)THEN
	BEGIN
	IF curcmd=67 THEN
	    Backinput
	ELSE
	    IF
	    curchr<>0 THEN
		negative:=NOT negative;
	Scanthe(2,negative);
	negative:=false;
	IF curvallevel=2 THEN
	    GOTO 10;
	IF curvallevel=0 THEN
	    Scandimen(mu,false,true);
	END
    ELSE
	BEGIN
	Backinput;
	Scandimen(mu,false,false);
	END;
    {416}q:=Newspec(0);
    mem[q+1].int:=curval;
    IF Scankeyword(527)THEN
	BEGIN
	Scandimen(mu,true,false);
	mem[q+2].int:=curval;
	mem[q].hh.b0:=curorder;
	END;
    IF Scankeyword(528)THEN
	BEGIN
	Scandimen(mu,true,false);
	mem[q+3].int:=curval;
	mem[q].hh.b1:=curorder;
	END;
    curval:=q;
    IF negative THEN
	{417}
	BEGIN
	mem[curval+1].int:=-mem[curval+1].int;
	mem[curval+2].int:=-mem[curval+2].int;
	mem[curval+3].int:=-mem[curval+3].int;
	END;
    10:
    END;
    {418}
FUNCTION Scanrulespec:halfword;
    LABEL
	21;
    VAR
	q:halfword;
    BEGIN
    q:=Newrule;
    IF curcmd=35 THEN
	mem[q+1].int:=26215
    ELSE
	BEGIN
	mem[q+3].int:=26215;
	mem[q+2].int:=0;
	END;
    21:
    IF Scankeyword(529)THEN
	BEGIN
	Scandimen(false,false,false);
	mem[q+1].int:=curval;
	GOTO 21;
	END;
    IF Scankeyword(530)THEN
	BEGIN
	Scandimen(false,false,false);
	mem[q+3].int:=curval;
	GOTO 21;
	END;
    IF Scankeyword(531)THEN
	BEGIN
	Scandimen(false,false,false);
	mem[q+2].int:=curval;
	GOTO 21;
	END;
    Scanrulespec:=q;
    END;
    {419}
FUNCTION Strtoks:halfword;
    VAR
	p:halfword;
	q:halfword;
	t:halfword;
	k:poolpointer;
    BEGIN
    BEGIN
    IF poolptr+1>poolsize THEN
	Overflow(129,poolsize);
    END;
    p:=10003;
    mem[p].hh.rh:=0;
    k:=strstart[strptr];
    WHILE k<poolptr DO
	BEGIN
	t:=strpool[k];
	IF t=32 THEN
	    t:=2592
	ELSE
	    IF t>=97 THEN
		t:=2816+t
	    ELSE
		t:=3072+t;
	BEGIN
	q:=Getavail;
	mem[p].hh.rh:=q;
	mem[q].hh.lh:=t;
	p:=q;
	END;
	k:=k+1;
	END;
    poolptr:=strstart[strptr];
    Strtoks:=p;
    END;
    {420}
FUNCTION Thetoks(negative:boolean):halfword;
    VAR
	oldsetting:0..21;
	p,q,r:halfword;
    BEGIN
    Scanthe(4,negative);
    IF curvallevel=4 THEN
	{421}
	BEGIN
	r:=mem[curval].hh.rh;
	p:=10003;
	mem[p].hh.rh:=0;
	IF curval<>0 THEN
	    WHILE r<>0 DO
		BEGIN
		BEGIN
		q:=Getavail;
		mem[p].hh.rh:=q;
		mem[q].hh.lh:=mem[r].hh.lh;
		p:=q;
		END;
		r:=mem[r].hh.rh;
		END;
	Thetoks:=p;
	END
    ELSE
	BEGIN
	oldsetting:=selector;
	selector:=21;
	CASE curvallevel OF
	    0:Printint(curval);
	    1:BEGIN
		Printscaled(curval);
		Print(497);
		END;
	    2:BEGIN
		Printspec(curval,497);
		Deletegluere(curval);
		END;
	    3:BEGIN
		Printspec(curval,203);
		Deletegluere(curval);
		END;
	    END;
	selector:=oldsetting;
	Thetoks:=Strtoks;
	END;
    END;
    {422}
FUNCTION Numtoks:halfword;
    VAR
	oldsetting:0..21;
    BEGIN
    oldsetting:=selector;
    Scanthe(0,false);
    selector:=21;
    IF curval>=0 THEN
	Printint(curval)
    ELSE
	Printromanin(-curval);
    selector:=oldsetting;
    Numtoks:=Strtoks;
    END;
    {423}
FUNCTION Scantoks(macrodef,xpand:boolean):halfword;
    LABEL
	40,30,31,32;
    VAR
	t:halfword;
	s:halfword;
	p:halfword;
	q:halfword;
	unbalance:halfword;
	hashbrace:halfword;
    BEGIN
    scannerstatu:=2;
    warningindex:=csptr;
    defref:=Getavail;
    mem[defref].hh.lh:=0;
    p:=defref;
    hashbrace:=0;
    t:=3120;
    IF macrodef THEN
	{424}
	BEGIN
	WHILE true DO
	    BEGIN
	    Gettoken;
	    IF curtok<768 THEN
		GOTO 31;
	    IF curcmd=6 THEN
		{426}
		BEGIN
		s:=3328+curchr;
		Gettoken;
		IF curcmd=1 THEN
		    BEGIN
		    hashbrace:=curtok;
		    BEGIN
		    q:=Getavail;
		    mem[p].hh.rh:=q;
		    mem[q].hh.lh:=curtok;
		    p:=q;
		    END;
		    BEGIN
		    q:=Getavail;
		    mem[p].hh.rh:=q;
		    mem[q].hh.lh:=3584;
		    p:=q;
		    END;
		    GOTO 30;
		    END;
		IF t=3129 THEN
		    BEGIN
		    Printnl(534);
		    BEGIN
		    helpptr:=1;
		    helpline[0]:=535;
		    END;
		    Error;
		    END
		ELSE
		    BEGIN
		    t:=t+1;
		    IF curtok<>t THEN
			BEGIN
			Printnl(536);
			BEGIN
			helpptr:=2;
			helpline[1]:=537;
			helpline[0]:=538;
			END;
			Backerror;
			END;
		    curtok:=s;
		    END;
		END;
	    BEGIN
	    q:=Getavail;
	    mem[p].hh.rh:=q;
	    mem[q].hh.lh:=curtok;
	    p:=q;
	    END;
	    END;
    31:
	BEGIN
	q:=Getavail;
	mem[p].hh.rh:=q;
	mem[q].hh.lh:=3584;
	p:=q;
	END;
	IF curcmd=2 THEN
	    {425}
	    BEGIN
	    Printnl(451);
	    alignstate:=alignstate+1;
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=532;
	    helpline[0]:=533;
	    END;
	    Error;
	    GOTO 40;
	    END;
    30:
	END
    ELSE
	Scanleftbrac;
    {427}unbalance:=1;
    WHILE true DO
	BEGIN
	IF xpand AND(curcmd<>82)THEN
	    {428}
	    BEGIN
	    WHILE true DO
		BEGIN
		Getnctoken;
		IF curcmd=66 THEN
		    q:=Thetoks(curchr>0)
		ELSE
		    IF curcmd=65 THEN
			q:=Numtoks
		    ELSE
			GOTO 32;
		mem[p].hh.rh:=mem[10003].hh.rh;
		p:=q;
		END;
    32:
	    END
	ELSE
	    Gettoken;
	IF curtok<768 THEN
	    IF curcmd<2 THEN
		unbalance:=unbalance+1
	    ELSE
		BEGIN
		unbalance:=unbalance-1;
		IF unbalance=0 THEN
		    GOTO 40;
		END
	ELSE
	    IF curcmd=6 THEN
		{429}
		BEGIN
		s:=curtok;
		Gettoken;
		IF curcmd<>6 THEN
		    IF(curchr<49)OR(curchr>t-3072)OR(curcmd<>12)THEN
			BEGIN
			Printnl(539);
			Sprintcs(warningindex);
			BEGIN
			helpptr:=3;
			helpline[2]:=540;
			helpline[1]:=541;
			helpline[0]:=542;
			END;
			Backerror;
			curtok:=s;
			END
		    ELSE
			curtok:=1232+curchr;
		END;
	BEGIN
	q:=Getavail;
	mem[p].hh.rh:=q;
	mem[q].hh.lh:=curtok;
	p:=q;
	END;
	END;
    40:
    scannerstatu:=0;
    {369}
    BEGIN
    Getnctoken;
    IF curcmd<>10 THEN
	Backinput;
    END;
    IF hashbrace<>0 THEN
	BEGIN
	q:=Getavail;
	mem[p].hh.rh:=q;
	mem[q].hh.lh:=hashbrace;
	p:=q;
	END;
    Scantoks:=p;
    END;

{434}PROCEDURE Beginname;
    BEGIN
    areadelimite:=0;
    extdelimiter:=0;
    END;
    {435}
FUNCTION Morename(c:asciicode):boolean;
    BEGIN
    IF c=32 THEN
	Morename:=false
    ELSE
	BEGIN
	IF c=91 THEN
	    areadelimite
	    :=poolptr
	ELSE
	    IF c=46 THEN
		extdelimiter:=poolptr;
	BEGIN
	IF poolptr+1>poolsize THEN
	    Overflow(129,poolsize);
	END;
	BEGIN
	strpool[poolptr]:=c;
	poolptr:=poolptr+1;
	END;
	Morename:=true;
	END;
    END;
    {436}
PROCEDURE Endname;
    BEGIN
    IF strptr+3>maxstrings THEN
	Overflow(130,maxstrings);
    curname:=strptr;
    IF extdelimiter=0 THEN
	curext:=226
    ELSE
	BEGIN
	strptr:=strptr+1;
	strstart[strptr]:=extdelimiter;
	curext:=strptr;
	END;
    IF areadelimite<=strstart[strptr]THEN
	BEGIN
	curarea:=226;
	strptr:=strptr+1;
	strstart[strptr]:=poolptr;
	END
    ELSE
	BEGIN
	strptr:=strptr+1;
	strstart[strptr]:=areadelimite;
	curarea:=Makestring;
	END;
    END;
    {438}
PROCEDURE Packfilename(n,a,e:strnumber);
    VAR
	k:integer;
	c:asciicode;
	j:poolpointer;
    BEGIN
    IF(strstart[a+1]-strstart[a])+(strstart[n+1]-strstart[n])+(
							       strstart[e+1]-strstart[e])>filenamesize THEN
	Overflow(544,filenamesize);
    k:=1;
    IF(e=545)AND((strstart[n+1]-strstart[n])>6)THEN
	BEGIN
	FOR j:=strstart[n]
	TO strstart[n]+2 DO
	    BEGIN
	    c:=strpool[j];
	    IF(c>=97)AND(c<=122)THEN
		c:=c-32;
	    nameoffile[k]:=xchr[c];
	    k:=k+1;
	    END;
	FOR j:=strstart[n+1]-3 TO strstart[n+1]-1 DO
	    BEGIN
	    c:=strpool[j];
	    IF(c>=97)AND(c<=122)THEN
		c:=c-32;
	    nameoffile[k]:=xchr[c];
	    k:=k+1;
	    END;
	END
    ELSE
	FOR j:=strstart[n]TO strstart[n+1]-1 DO
	    BEGIN
	    c:=strpool[j];
	    IF(c>=97)AND(c<=122)THEN
		c:=c-32;
	    nameoffile[k]:=xchr[c];
	    k:=k+1;
	    END;
    FOR j:=strstart[e]TO strstart[e+1]-1 DO
	BEGIN
	c:=strpool[j];
	IF(c>=97)AND(c<=122)THEN
	    c:=c-32;
	nameoffile[k]:=xchr[c];
	k:=k+1;
	END;
    FOR j:=strstart[a]TO strstart[a+1]-1 DO
	BEGIN
	c:=strpool[j];
	IF(c>=97)AND(c<=122)THEN
	    c:=c-32;
	nameoffile[k]:=xchr[c];
	k:=k+1;
	END;
    namelength:=k-1;
    FOR k:=namelength+1 TO filenamesize DO nameoffile[k]:=' ';
    END;
    {442}
PROCEDURE Packbuffered(n:smallnumber;
		       a,b:integer);
    VAR
	k:integer;
	c:asciicode;
	j:integer;
	d:integer;
    BEGIN
    IF n+b-a+5>filenamesize THEN
	b:=a+filenamesize-n-5;
    k:=1;
    FOR j:=a TO b DO
	BEGIN
	c:=buffer[j];
	IF(c>=97)AND(c<=122)THEN
	    c:=c-32;
	nameoffile[k]:=xchr[c];
	k:=k+1;
	END;
    IF b=0 THEN
	d:=1
    ELSE
	d:=6;
    FOR j:=d TO 9 DO
	BEGIN
	c:=xord[texformatdef[j]];
	IF(c>=97)AND(c<=122)THEN
	    c:=c-32;
	nameoffile[k]:=xchr[c];
	k:=k+1;
	END;
    FOR j:=1 TO n DO
	BEGIN
	c:=xord[texformatdef[j]];
	IF(c>=97)AND(c<=122)THEN
	    c:=c-32;
	nameoffile[k]:=xchr[c];
	k:=k+1;
	END;
    namelength:=k-1;
    FOR k:=namelength+1 TO filenamesize DO nameoffile[k]:=' ';
    END;
    {444}
PROCEDURE Curnam(VAR chan:FILE;
		 VAR s:string);
    EXTERN;
FUNCTION Makenamestri(VAR f:FILE):strnumber;
    VAR
	s:PACKED ARRAY[1..24]OF char;
	k:1..24;
    BEGIN
    Curnam(f,s);
    BEGIN
    IF poolptr+24>poolsize THEN
	Overflow(129,poolsize);
    END;
    k:=1;
    WHILE Ord(s[k])<>0 DO
	BEGIN
	BEGIN
	strpool[poolptr]:=xord[s[k]];
	poolptr:=poolptr+1;
	END;
	k:=k+1;
	END;
    Makenamestri:=Makestring;
    END;
FUNCTION Amakenamestr(VAR f:alphafile):strnumber;
    BEGIN
    Amakenamestr:=Makenamestri(f);
    END;
FUNCTION Bmakenamestr(VAR f:bytefile):strnumber;
    BEGIN
    Bmakenamestr:=Makenamestri(f);
    END;
FUNCTION Wmakenamestr(VAR f:wordfile):strnumber;
    BEGIN
    Wmakenamestr:=Makenamestri(f);
    END;
    {445}
PROCEDURE Writenamestr;
    VAR
	s:PACKED ARRAY[1..24]OF char;
	k:1..24;
    BEGIN
    Curnam(fmtfile,s);
    k:=1;
    WHILE xord[s[k]]<>0 DO
	BEGIN
	Write(termout,s[k]);
	k:=k+1;
	END;
    END;
    {446}
PROCEDURE Scanfilename;
    LABEL
	30;
    BEGIN
    Beginname;
    {366}
    REPEAT
	Getnctoken;
    UNTIL curcmd<>10;
    WHILE true DO
	BEGIN
	IF(curcmd>12)OR(curchr>127)THEN
	    BEGIN
	    Backinput;
	    GOTO 30;
	    END;
	IF NOT Morename(curchr)THEN
	    GOTO 30;
	Getnctoken;
	END;
    30:
    Endname;
    END;
    {449}
PROCEDURE Packjobname(s:strnumber);
    BEGIN
    curarea:=226;
    curext:=s;
    curname:=jobname;
    Packfilename(curname,curarea,curext);
    END;
    {450}
PROCEDURE Promptfilena(s,e:strnumber);
    LABEL
	30;
    VAR
	k:0..bufsize;
    BEGIN
    IF s=546 THEN
	Printnl(547)
    ELSE
	Printnl(548);
    Printfilenam(curname,curarea,curext);
    Print(549);
    IF e=550 THEN
	Showcontext;
    Printnl(551);
    Print(s);
    IF interaction<2 THEN
	Fatalerror(552);
    breakin(termin,true);
    BEGIN
    Print(553);
    Terminput;
    END;
    {451}
    BEGIN
    Beginname;
    k:=first;
    WHILE(buffer[k]=32)AND(k<last)DO k:=k+1;
    WHILE true DO
	BEGIN
	IF k=last THEN
	    GOTO 30;
	IF NOT Morename(buffer[k])THEN
	    GOTO 30;
	k:=k+1;
	END;
    30:
    Endname;
    END;
    IF curext=226 THEN
	curext:=e;
    Packfilename(curname,curarea,curext);
    END;
    {454}
PROCEDURE Openlogfile;
    VAR
	oldsetting:0..21;
	k:0..bufsize;
	months:PACKED ARRAY[1..36]OF char;
    BEGIN
    oldsetting:=selector;
    IF jobname=0 THEN
	jobname:=556;
    Packjobname(557);
    WHILE NOT Aopenout(logfile)DO Promptfilena(558,557);
    selector:=18;
    {455}
    BEGIN
    Write(logfile,'This is TeX, Version -0.18S');
    Print(formatident);
    Print(560);
    Printint(eqtb[3604].int);
    Printchar(32);
    months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
    FOR k:=3*eqtb[3605].int-2 TO 3*eqtb[3605].int DO Write(logfile,months[k]
							   );
    Printchar(32);
    Printint(eqtb[3606].int);
    Printchar(32);
    Printint(eqtb[3603].int DIV 60);
    Printchar(58);
    Printchar(48+((eqtb[3603].int MOD 60)DIV 10));
    Printchar(48+(eqtb[3603].int MOD 10));
    END;
    inputstack[inputptr]:=curinput;
    Printnl(559);
    FOR k:=1 TO inputstack[0].limitfield DO Print(buffer[k-1]);
    Println;
    selector:=oldsetting+2;
    END;
    {456}
PROCEDURE Startinput;
    LABEL
	30;
    BEGIN
    Scanfilename;
    IF curext=226 THEN
	curext:=550;
    Packfilename(curname,curarea,curext);
    WHILE true DO
	BEGIN
	Beginfilerea;
	IF Aopenin(inputfile[curinput.indexfield])THEN
	    GOTO 30;
	Packfilename(curname,543,curext);
	IF Aopenin(inputfile[curinput.indexfield])THEN
	    GOTO 30;
	Endfilereadi;
	Promptfilena(546,550);
	END;
    30:
    curinput.namefield:=Amakenamestr(inputfile[curinput.indexfield]);
    curinput.statefield:=33;
    IF jobname=0 THEN
	BEGIN
	jobname:=curname;
	Openlogfile;
	END;
    Print(153);
    Print(curinput.namefield);
    Break(termout);
    {457}
    BEGIN
    IF Eoln(inputfile[curinput.indexfield])THEN
	last:=curinput.
	startfield
    ELSE
	BEGIN
	buffer[curinput.startfield]:=xord[inputfile[
						    curinput.indexfield]↑];
	first:=curinput.startfield+1;
	IF NOT Inputln(inputfile[curinput.indexfield])THEN
	    Confusion(323);
	IF(last-curinput.startfield=29)AND(buffer[curinput.startfield]=67)AND(
									      buffer[curinput.startfield+8]=22)THEN
	    BEGIN
	    WHILE(inputfile[curinput.
	    indexfield]↑<>Chr(12))AND(NOT Eof(inputfile[curinput.indexfield]))DO
		BEGIN
		Readln(inputfile[curinput.indexfield]);
		Read(inputfile[curinput.indexfield],auxbuf:tempptr);
		END;
	    buffer[curinput.startfield]:=12;
	    last:=curinput.startfield+1;
	    END;
	END;
    Firmupthelin;
    buffer[curinput.limitfield]:=13;
    first:=curinput.limitfield+1;
    curinput.locfield:=curinput.startfield;
    line:=1;
    page:=1;
    END;
    END;

{477}PROCEDURE Readfontinfo(u:userfontcode;
		       nom,aire:strnumber;
		       s:scaled);
    LABEL
	30,11,45;
    VAR
	k:0..fontmemsize;
	fileopened:boolean;
	lf,lh,bc,ec,nw,nh,nd,ni,nl,nk,ne,np:halfword;
	f:internalfont;
	a,b,c,d:eightbits;
	qw:fourquarters;
	sw:scaled;
	z:scaled;
	alpha:integer;
	beta:1..16;
    BEGIN{479}{480}
    fileopened:=false;
    IF aire=226 THEN
	Packfilename(nom,543,545)
    ELSE
	Packfilename(nom,aire,545
		     );
    IF NOT Bopenin(tfmfile)THEN
	GOTO 11;
    fileopened:=true;
    {482}
    BEGIN
    BEGIN
    lf:=tfmfile↑;
    IF lf>127 THEN
	GOTO 11;
    Get(tfmfile);
    lf:=lf*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    lh:=tfmfile↑;
    IF lh>127 THEN
	GOTO 11;
    Get(tfmfile);
    lh:=lh*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    bc:=tfmfile↑;
    IF bc>127 THEN
	GOTO 11;
    Get(tfmfile);
    bc:=bc*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    ec:=tfmfile↑;
    IF ec>127 THEN
	GOTO 11;
    Get(tfmfile);
    ec:=ec*256+tfmfile↑;
    END;
    IF(bc>ec+1)OR(ec>255)THEN
	GOTO 11;
    Get(tfmfile);
    BEGIN
    nw:=tfmfile↑;
    IF nw>127 THEN
	GOTO 11;
    Get(tfmfile);
    nw:=nw*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    nh:=tfmfile↑;
    IF nh>127 THEN
	GOTO 11;
    Get(tfmfile);
    nh:=nh*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    nd:=tfmfile↑;
    IF nd>127 THEN
	GOTO 11;
    Get(tfmfile);
    nd:=nd*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    ni:=tfmfile↑;
    IF ni>127 THEN
	GOTO 11;
    Get(tfmfile);
    ni:=ni*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    nl:=tfmfile↑;
    IF nl>127 THEN
	GOTO 11;
    Get(tfmfile);
    nl:=nl*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    nk:=tfmfile↑;
    IF nk>127 THEN
	GOTO 11;
    Get(tfmfile);
    nk:=nk*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    ne:=tfmfile↑;
    IF ne>127 THEN
	GOTO 11;
    Get(tfmfile);
    ne:=ne*256+tfmfile↑;
    END;
    Get(tfmfile);
    BEGIN
    np:=tfmfile↑;
    IF np>127 THEN
	GOTO 11;
    Get(tfmfile);
    np:=np*256+tfmfile↑;
    END;
    IF lf<>6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ne+np THEN
	GOTO 11;
    END;
    {483}lf:=lf-6-lh;
    IF np<7 THEN
	lf:=lf+7-np;
    IF(fontptr=fontmax)OR(fmemptr+lf>fontmemsize)THEN
	{484}
	BEGIN
	Printnl(561)
	;
	Printint(u);
	Printchar(61);
	Printfilenam(nom,aire,226);
	IF s<>0 THEN
	    BEGIN
	    Print(562);
	    Printscaled(s);
	    Print(497);
	    END;
	Print(570);
	BEGIN
	helpptr:=4;
	helpline[3]:=571;
	helpline[2]:=572;
	helpline[1]:=573;
	helpline[0]:=574;
	END;
	Error;
	GOTO 30;
	END;
    f:=fontptr+1;
    charbase[f]:=fmemptr-bc;
    widthbase[f]:=charbase[f]+ec+1;
    heightbase[f]:=widthbase[f]+nw;
    depthbase[f]:=heightbase[f]+nh;
    italicbase[f]:=depthbase[f]+nd;
    ligkernbase[f]:=italicbase[f]+ni;
    kernbase[f]:=ligkernbase[f]+nl;
    extenbase[f]:=kernbase[f]+nk;
    parambase[f]:=extenbase[f]+ne;
    {485}
    BEGIN
    IF lh<2 THEN
	GOTO 11;
    BEGIN
    Get(tfmfile);
    a:=tfmfile↑;
    qw.b0:=a;
    Get(tfmfile);
    b:=tfmfile↑;
    qw.b1:=b;
    Get(tfmfile);
    c:=tfmfile↑;
    qw.b2:=c;
    Get(tfmfile);
    d:=tfmfile↑;
    qw.b3:=d;
    fontcheck[f]:=qw;
    END;
    Get(tfmfile);
    BEGIN
    z:=tfmfile↑;
    IF z>127 THEN
	GOTO 11;
    Get(tfmfile);
    z:=z*256+tfmfile↑;
    END;
    Get(tfmfile);
    z:=z*256+tfmfile↑;
    Get(tfmfile);
    z:=(z*16)+(tfmfile↑DIV 16);
    IF z<65536 THEN
	GOTO 11;
    WHILE lh>2 DO
	BEGIN
	Get(tfmfile);
	Get(tfmfile);
	Get(tfmfile);
	Get(tfmfile);
	lh:=lh-1;
	END;
    fontdsize[f]:=z;
    IF s<>0 THEN
	z:=s;
    fontsize[f]:=z;
    END;
    {486}
    FOR k:=fmemptr TO widthbase[f]-1 DO
	BEGIN
	BEGIN
	Get(tfmfile);
	a:=tfmfile↑;
	qw.b0:=a;
	Get(tfmfile);
	b:=tfmfile↑;
	qw.b1:=b;
	Get(tfmfile);
	c:=tfmfile↑;
	qw.b2:=c;
	Get(tfmfile);
	d:=tfmfile↑;
	qw.b3:=d;
	fontinfo[k].qqqq:=qw;
	END;
	IF(a>=nw)OR(b DIV 16>=nh)OR(b MOD 16>=nd)OR(c DIV 4>=ni)THEN
	    GOTO 11;
	CASE c MOD 4 OF
	    1:IF d>=nl THEN
		  GOTO 11;
	    3:IF d>=ne THEN
		  GOTO 11;
	    2:{487}BEGIN
		BEGIN
		IF(d<bc)OR(d>ec)THEN
		    GOTO 11
		END;
		WHILE d<k+bc-fmemptr DO
		    BEGIN
		    qw:=fontinfo[charbase[f]+d].qqqq;
		    IF(qw.b2 MOD 4)<>2 THEN
			GOTO 45;
		    d:=qw.b3;
		    END;
		IF d=k+bc-fmemptr THEN
		    GOTO 11;
    45:
		END;
	    OTHERS:
	    END;
	END;
    {488}
    BEGIN{489}
    BEGIN
    alpha:=16*z;
    beta:=16;
    WHILE z>=8388608 DO
	BEGIN
	z:=z DIV 2;
	beta:=beta DIV 2;
	END;
    END;
    FOR k:=widthbase[f]TO ligkernbase[f]-1 DO
	BEGIN
	Get(tfmfile);
	a:=tfmfile↑;
	Get(tfmfile);
	b:=tfmfile↑;
	Get(tfmfile);
	c:=tfmfile↑;
	Get(tfmfile);
	d:=tfmfile↑;
	sw:=(((((d*z)DIV 256)+(c*z))DIV 256)+(b*z))DIV beta;
	IF a=0 THEN
	    fontinfo[k].int:=sw
	ELSE
	    IF a=255 THEN
		fontinfo[k].int:=sw-
		alpha
	    ELSE
		GOTO 11;
	END;
    IF fontinfo[widthbase[f]].int<>0 THEN
	GOTO 11;
    IF fontinfo[heightbase[f]].int<>0 THEN
	GOTO 11;
    IF fontinfo[depthbase[f]].int<>0 THEN
	GOTO 11;
    IF fontinfo[italicbase[f]].int<>0 THEN
	GOTO 11;
    END;
    {490}
    BEGIN
    FOR k:=ligkernbase[f]TO kernbase[f]-1 DO
	BEGIN
	BEGIN
	Get(
	    tfmfile);
	a:=tfmfile↑;
	qw.b0:=a;
	Get(tfmfile);
	b:=tfmfile↑;
	qw.b1:=b;
	Get(tfmfile);
	c:=tfmfile↑;
	qw.b2:=c;
	Get(tfmfile);
	d:=tfmfile↑;
	qw.b3:=d;
	fontinfo[k].qqqq:=qw;
	END;
	BEGIN
	IF(b<bc)OR(b>ec)THEN
	    GOTO 11
	END;
	IF c<128 THEN
	    BEGIN
	    IF(d<bc)OR(d>ec)THEN
		GOTO 11
	    END
	ELSE
	    IF d>=nk THEN
		GOTO 11;
	END;
    IF(nl>0)AND(a<128)THEN
	GOTO 11;
    FOR k:=kernbase[f]TO extenbase[f]-1 DO
	BEGIN
	Get(tfmfile);
	a:=tfmfile↑;
	Get(tfmfile);
	b:=tfmfile↑;
	Get(tfmfile);
	c:=tfmfile↑;
	Get(tfmfile);
	d:=tfmfile↑;
	sw:=(((((d*z)DIV 256)+(c*z))DIV 256)+(b*z))DIV beta;
	IF a=0 THEN
	    fontinfo[k].int:=sw
	ELSE
	    IF a=255 THEN
		fontinfo[k].int:=sw-
		alpha
	    ELSE
		GOTO 11;
	END;
    END;
    {491}
    FOR k:=extenbase[f]TO parambase[f]-1 DO
	BEGIN
	BEGIN
	Get(tfmfile);
	a:=tfmfile↑;
	qw.b0:=a;
	Get(tfmfile);
	b:=tfmfile↑;
	qw.b1:=b;
	Get(tfmfile);
	c:=tfmfile↑;
	qw.b2:=c;
	Get(tfmfile);
	d:=tfmfile↑;
	qw.b3:=d;
	fontinfo[k].qqqq:=qw;
	END;
	IF a<>0 THEN
	    BEGIN
	    IF(a<bc)OR(a>ec)THEN
		GOTO 11
	    END;
	IF b<>0 THEN
	    BEGIN
	    IF(b<bc)OR(b>ec)THEN
		GOTO 11
	    END;
	IF c<>0 THEN
	    BEGIN
	    IF(c<bc)OR(c>ec)THEN
		GOTO 11
	    END;
	BEGIN
	IF(d<bc)OR(d>ec)THEN
	    GOTO 11
	END;
	END;
    {492}
    BEGIN
    FOR k:=1 TO np DO
	IF k=1 THEN
	    BEGIN
	    Get(tfmfile);
	    sw:=tfmfile↑;
	    IF sw>127 THEN
		sw:=sw-256;
	    Get(tfmfile);
	    sw:=sw*256+tfmfile↑;
	    Get(tfmfile);
	    sw:=sw*256+tfmfile↑;
	    Get(tfmfile);
	    fontinfo[parambase[f]].int:=(sw*16)+(tfmfile↑DIV 16);
	    END
	ELSE
	    BEGIN
	    Get(tfmfile);
	    a:=tfmfile↑;
	    Get(tfmfile);
	    b:=tfmfile↑;
	    Get(tfmfile);
	    c:=tfmfile↑;
	    Get(tfmfile);
	    d:=tfmfile↑;
	    sw:=(((((d*z)DIV 256)+(c*z))DIV 256)+(b*z))DIV beta;
	    IF a=0 THEN
		fontinfo[parambase[f]+k-1].int:=sw
	    ELSE
		IF a=255 THEN
		    fontinfo[parambase[f]+k-1].int:=sw-alpha
		ELSE
		    GOTO 11;
	    END;
    IF Eof(tfmfile)THEN
	GOTO 11;
    FOR k:=np+1 TO 7 DO fontinfo[parambase[f]+k-1].int:=0;
    END;
    {493}fontcode[f]:=u;
    fontnumber[u]:=f;
    IF np>=7 THEN
	fontparams[f]:=np
    ELSE
	fontparams[f]:=7;
    fontname[f]:=nom;
    fontarea[f]:=aire;
    fontbc[f]:=bc;
    fontec[f]:=ec;
    fontglue[f]:=0;
    charbase[f]:=charbase[f];
    widthbase[f]:=widthbase[f];
    ligkernbase[f]:=ligkernbase[f];
    kernbase[f]:=kernbase[f];
    extenbase[f]:=extenbase[f];
    parambase[f]:=parambase[f]-1;
    fmemptr:=fmemptr+lf;
    fontptr:=f;
    GOTO 30;
    11:{478}
    Printnl(561);
    Printint(u);
    Printchar(61);
    Printfilenam(nom,aire,226);
    IF s<>0 THEN
	BEGIN
	Print(562);
	Printscaled(s);
	Print(497);
	END;
    IF fileopened THEN
	Print(563)
    ELSE
	Print(564);
    BEGIN
    helpptr:=5;
    helpline[4]:=565;
    helpline[3]:=566;
    helpline[2]:=567;
    helpline[1]:=568;
    helpline[0]:=569;
    END;
    Error;
    30:
    Bclose(tfmfile);
    END;

{498}PROCEDURE Charwarning(f:internalfont;
		      c:eightbits);
    BEGIN
    IF eqtb[3616].int<>0 THEN
	BEGIN
	Begindiagnos;
	Printnl(584);
	Printascii(c);
	Print(585);
	Print(fontname[f]);
	Printchar(33);
	Enddiagnosti(false);
	END;
    END;
    {499}
FUNCTION Newcharacter(f:internalfont;
		      c:eightbits):halfword;
    LABEL
	10;
    VAR
	p:halfword;
    BEGIN
    IF(fontbc[f]<=c)AND(fontec[f]>=c)THEN
	IF(fontinfo[charbase[f]+c].
	   qqqq.b0>0)THEN
	    BEGIN
	    p:=Getavail;
	    mem[p].hh.b0:=f;
	    mem[p].hh.b1:=c;
	    Newcharacter:=p;
	    GOTO 10;
	    END;
    Charwarning(f,c);
    Newcharacter:=0;
    10:
    END;
    {513}
PROCEDURE Aryout(VAR f:FILE;
		 b:packedbytes;
		 o,c:integer);
    EXTERN;
PROCEDURE Writedvi(a,b:dviindex);
    BEGIN
    Aryout(dvifile,dvibuf,a DIV 4,(b+1-a)DIV 4);
    END;
    {514}
PROCEDURE Dviswap;
    BEGIN
    IF dvilimit=dvibufsize THEN
	BEGIN
	Writedvi(0,halfbuf-1);
	dvilimit:=halfbuf;
	dvioffset:=dvioffset+dvibufsize;
	dviptr:=0;
	END
    ELSE
	BEGIN
	Writedvi(halfbuf,dvibufsize-1);
	dvilimit:=dvibufsize;
	END;
    dvigone:=dvigone+halfbuf;
    END;
    {516}
PROCEDURE Dvifour(x:integer);
    BEGIN
    IF x>=0 THEN
	BEGIN
	dvibuf[dviptr]:=x DIV 16777216;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END
    ELSE
	BEGIN
	x:=x+1073741824;
	x:=x+1073741824;
	BEGIN
	dvibuf[dviptr]:=(x DIV 16777216)+128;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	END;
    x:=x MOD 16777216;
    BEGIN
    dvibuf[dviptr]:=x DIV 65536;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    x:=x MOD 65536;
    BEGIN
    dvibuf[dviptr]:=x DIV 256;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    BEGIN
    dvibuf[dviptr]:=x MOD 256;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    END;
    {520}
PROCEDURE Movement(w:scaled;
		   o:eightbits);
    LABEL
	10,40,45,2,1;
    VAR
	mstate:smallnumber;
	p,q:halfword;
	k:integer;
    BEGIN
    q:=Getnode(3);
    mem[q+1].int:=w;
    mem[q+2].int:=dvioffset+dviptr;
    IF o=157 THEN
	BEGIN
	mem[q].hh.rh:=downptr;
	downptr:=q;
	END
    ELSE
	BEGIN
	mem[q].hh.rh:=rightptr;
	rightptr:=q;
	END;
    {524}p:=mem[q].hh.rh;
    mstate:=0;
    WHILE p<>0 DO
	BEGIN
	IF mem[p+1].int=w THEN
	    {525}
	    CASE mstate+mem[p].hh.lh
		OF
		3,4,15,16:IF mem[p+2].int<dvigone THEN
			      GOTO 45
			  ELSE
			      {526}
			      BEGIN
			      k:=mem[
				     p+2].int-dvioffset;
			      IF k<0 THEN
				  k:=k+dvibufsize;
			      dvibuf[k]:=dvibuf[k]+5;
			      mem[p].hh.lh:=1;
			      GOTO 40;
			      END;
		5,9,11:IF mem[p+2].int<dvigone THEN
			   GOTO 45
		       ELSE
			   {527}
			   BEGIN
			   k:=mem[p+2].
			   int-dvioffset;
			   IF k<0 THEN
			       k:=k+dvibufsize;
			   dvibuf[k]:=dvibuf[k]+10;
			   mem[p].hh.lh:=2;
			   GOTO 40;
			   END;
		1,2,8,13:GOTO 40;
		OTHERS:
		END
	ELSE
	    CASE mstate+mem[p].hh.lh OF
		1:mstate:=6;
		2:mstate:=12;
		8,13:GOTO 45;
		OTHERS:
		END;
	p:=mem[p].hh.rh;
	END;
    45:;
    {523}mem[q].hh.lh:=3;
    IF Abs(w)>=8388608 THEN
	BEGIN
	BEGIN
	dvibuf[dviptr]:=o+3;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	Dvifour(w);
	GOTO 10;
	END;
    IF Abs(w)>=32768 THEN
	BEGIN
	BEGIN
	dvibuf[dviptr]:=o+2;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	IF w<0 THEN
	    w:=w+16777216;
	BEGIN
	dvibuf[dviptr]:=w DIV 65536;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	w:=w MOD 65536;
	GOTO 2;
	END;
    IF Abs(w)>=128 THEN
	BEGIN
	BEGIN
	dvibuf[dviptr]:=o+1;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	IF w<0 THEN
	    w:=w+65536;
	GOTO 2;
	END;
    BEGIN
    dvibuf[dviptr]:=o;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    IF w<0 THEN
	w:=w+256;
    GOTO 1;
    2:
    BEGIN
    dvibuf[dviptr]:=w DIV 256;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    1:
    BEGIN
    dvibuf[dviptr]:=w MOD 256;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    GOTO 10;
    40:{522}
    mem[q].hh.lh:=mem[p].hh.lh;
    IF mem[q].hh.lh=1 THEN
	BEGIN
	BEGIN
	dvibuf[dviptr]:=o+4;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	WHILE mem[q].hh.rh<>p DO
	    BEGIN
	    q:=mem[q].hh.rh;
	    CASE mem[q].hh.lh OF
		3:mem[q].hh.lh:=5;
		4:mem[q].hh.lh:=6;
		OTHERS:
		END;
	    END;
	END
    ELSE
	BEGIN
	BEGIN
	dvibuf[dviptr]:=o+9;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	WHILE mem[q].hh.rh<>p DO
	    BEGIN
	    q:=mem[q].hh.rh;
	    CASE mem[q].hh.lh OF
		3:mem[q].hh.lh:=4;
		5:mem[q].hh.lh:=6;
		OTHERS:
		END;
	    END;
	END;
    10:
    END;
    {528}
PROCEDURE Prunemovemen(l:integer);
    LABEL
	30,10;
    VAR
	p:halfword;
    BEGIN
    WHILE downptr<>0 DO
	BEGIN
	IF mem[downptr+2].int<l THEN
	    GOTO 30;
	p:=downptr;
	downptr:=mem[p].hh.rh;
	Freenode(p,3);
	END;
    30:
    WHILE rightptr<>0 DO
	BEGIN
	IF mem[rightptr+2].int<l THEN
	    GOTO 10;
	p:=rightptr;
	rightptr:=mem[p].hh.rh;
	Freenode(p,3);
	END;
    10:
    END;
    {531}
PROCEDURE Vlistout;
    FORWARD;
    {532}{1246}
PROCEDURE Xsendout(p:halfword);
    VAR
	oldsetting:0..21;
	k:poolpointer;
    BEGIN
    IF curh<>dvih THEN
	BEGIN
	Movement(curh-dvih,143);
	dvih:=curh;
	END;
    IF curv<>dviv THEN
	BEGIN
	Movement(curv-dviv,157);
	dviv:=curv;
	END;
    oldsetting:=selector;
    selector:=21;
    Showtokenlis(mem[mem[p+1].hh.rh].hh.rh,0,poolsize-poolptr);
    selector:=oldsetting;
    BEGIN
    IF poolptr+1>poolsize THEN
	Overflow(129,poolsize);
    END;
    IF(poolptr-strstart[strptr])<256 THEN
	BEGIN
	BEGIN
	dvibuf[dviptr]:=239;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	BEGIN
	dvibuf[dviptr]:=(poolptr-strstart[strptr]);
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	END
    ELSE
	BEGIN
	BEGIN
	dvibuf[dviptr]:=242;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
	Dvifour((poolptr-strstart[strptr]));
	END;
    FOR k:=strstart[strptr]TO poolptr-1 DO
	BEGIN
	dvibuf[dviptr]:=strpool[k];
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    Dviswap;
	END;
    poolptr:=strstart[strptr];
    END;
    {1248}
PROCEDURE Sendout(p:halfword);
    VAR
	oldsetting:0..21;
	oldmode:integer;
	j:smallnumber;
	q,r:halfword;
    BEGIN{1249}
    q:=Getavail;
    mem[q].hh.lh:=637;
    r:=Getavail;
    mem[r].hh.lh:=2592;
    mem[q].hh.rh:=r;
    mem[r].hh.rh:=Getavail;
    r:=mem[r].hh.rh;
    mem[r].hh.lh:=6456;
    Begintokenli(q,3);
    Begintokenli(mem[p+1].hh.rh,8);
    q:=Getavail;
    mem[q].hh.lh:=379;
    Begintokenli(q,3);
    oldmode:=curlist.modefield;
    curlist.modefield:=0;
    csptr:=sendloc;
    q:=Scantoks(false,true);
    Gettoken;
    IF curtok<>6456 THEN
	Confusion(1050);
    Endtokenlist;
    curlist.modefield:=oldmode;
    oldsetting:=selector;
    j:=mem[p+1].hh.lh;
    IF sendopen[j]THEN
	selector:=j
    ELSE
	Printnl(226);
    Showtokenlis(mem[defref].hh.rh,0,bufsize-10);
    Println;
    Flushlist(defref);
    selector:=oldsetting;
    END;
    {1250}
PROCEDURE Outwhat(p:halfword);
    VAR
	j:smallnumber;
    BEGIN
    CASE mem[p].hh.b1 OF
	0,1,2:{1251}IF NOT doingleaders THEN
			BEGIN
			j
			:=mem[p+1].hh.lh;
			IF mem[p].hh.b1=1 THEN
			    Sendout(p)
			ELSE
			    BEGIN
			    IF sendopen[j]THEN
				Aclose(
				       sendfile[j]);
			    IF mem[p].hh.b1=2 THEN
				sendopen[j]:=false
			    ELSE
				BEGIN
				curname:=mem[p+1].
				hh.rh;
				curarea:=mem[p+2].hh.lh;
				curext:=mem[p+2].hh.rh;
				IF curext=226 THEN
				    curext:=550;
				Packfilename(curname,curarea,curext);
				WHILE NOT Aopenout(sendfile[j])DO Promptfilena(1060,550);
				sendopen[j]:=true;
				END;
			    END;
			END;
	3:Xsendout(p);
	OTHERS:Confusion(1059)
	END;
    END;
PROCEDURE Hlistout;
    LABEL
	21,13,14,15;
    VAR
	baseline:scaled;
	saveh,savev:scaled;
	thisbox:halfword;
	gorder:glueord;
	gsign:0..2;
	p:halfword;
	saveloc:integer;
	leaderbox:halfword;
	leaderwd:scaled;
	outerdoingle:boolean;
	edge:scaled;
    BEGIN
    thisbox:=tempptr;
    gorder:=mem[thisbox+5].hh.b1;
    gsign:=mem[thisbox+5].hh.b0;
    p:=mem[thisbox+5].hh.rh;
    curs:=curs+1;
    IF curs>maxpush THEN
	maxpush:=curs;
    saveloc:=dvioffset+dviptr;
    baseline:=curv;
    WHILE p<>0 DO{533}21:
	IF(p>10000)THEN
	    BEGIN
	    IF curh<>dvih THEN
		BEGIN
		Movement(curh-dvih,143);
		dvih:=curh;
		END;
	    IF curv<>dviv THEN
		BEGIN
		Movement(curv-dviv,157);
		dviv:=curv;
		END;
	    REPEAT
		f:=mem[p].hh.b0;
		c:=mem[p].hh.b1;
		IF f<>dvif THEN
		    {534}
		    BEGIN
		    IF f<=64 THEN
			BEGIN
			dvibuf[dviptr]:=f+170;
			dviptr:=dviptr+1;
			IF dviptr=dvilimit THEN
			    Dviswap;
			END
		    ELSE
			BEGIN
			BEGIN
			dvibuf[dviptr]:=235;
			dviptr:=dviptr+1;
			IF dviptr=dvilimit THEN
			    Dviswap;
			END;
			BEGIN
			dvibuf[dviptr]:=f-1;
			dviptr:=dviptr+1;
			IF dviptr=dvilimit THEN
			    Dviswap;
			END;
			END;
		    dvif:=f;
		    fontused[f]:=true;
		    END;
		IF c<128 THEN
		    BEGIN
		    dvibuf[dviptr]:=c;
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			Dviswap;
		    END
		ELSE
		    BEGIN
		    BEGIN
		    dvibuf[dviptr]:=128;
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			Dviswap;
		    END;
		    BEGIN
		    dvibuf[dviptr]:=c;
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			Dviswap;
		    END;
		    END;
		curh:=curh+fontinfo[widthbase[f]+fontinfo[charbase[f]+c].qqqq.b0].int;
		p:=mem[p].hh.rh;
	    UNTIL NOT(p>10000);
	    dvih:=curh;
	    END
	ELSE
	    IF p<>0 THEN
		{535}
		BEGIN
		CASE mem[p].hh.b0 OF
		    0,1:{536}IF mem[p+5
				    ].hh.rh=0 THEN
				 curh:=curh+mem[p+1].int
			     ELSE
				 BEGIN
				 saveh:=dvih;
				 savev:=dviv;
				 BEGIN
				 dvibuf[dviptr]:=141;
				 dviptr:=dviptr+1;
				 IF dviptr=dvilimit THEN
				     Dviswap;
				 END;
				 curv:=baseline+mem[p+4].int;
				 tempptr:=p;
				 edge:=curh;
				 IF mem[p].hh.b0=1 THEN
				     Vlistout
				 ELSE
				     Hlistout;
				 BEGIN
				 dvibuf[dviptr]:=142;
				 dviptr:=dviptr+1;
				 IF dviptr=dvilimit THEN
				     Dviswap;
				 END;
				 dvih:=saveh;
				 dviv:=savev;
				 curh:=edge+mem[p+1].int;
				 curv:=baseline;
				 END;
		    2:BEGIN
			ruleht:=mem[p+3].int;
			ruledp:=mem[p+2].int;
			rulewd:=mem[p+1].int;
			GOTO 14;
			END;
		    8:{1244}Outwhat(p);
		    10:{538}BEGIN
			g:=mem[p+1].hh.lh;
			rulewd:=mem[g+1].int;
			IF gsign<>0 THEN
			    BEGIN
			    IF gsign=1 THEN
				BEGIN
				IF mem[g].hh.b0=gorder THEN
				    rulewd:=rulewd+Round(mem[thisbox+6].gr*mem[g+2].int);
				END
			    ELSE
				BEGIN
				IF mem[g].hh.b1=gorder THEN
				    rulewd:=rulewd-Round(mem[
							     thisbox+6].gr*mem[g+3].int);
				END;
			    END;
			IF mem[p].hh.b1>=100 THEN
			    {539}
			    BEGIN
			    leaderbox:=mem[p+1].hh.rh;
			    IF mem[leaderbox].hh.b0=2 THEN
				BEGIN
				ruleht:=mem[leaderbox+3].int;
				ruledp:=mem[leaderbox+2].int;
				GOTO 14;
				END;
			    leaderwd:=mem[leaderbox+1].int;
			    IF(leaderwd>0)AND(rulewd>0)THEN
				BEGIN
				edge:=curh+rulewd;
				{540}
				IF mem[p].hh.b1=100 THEN
				    BEGIN
				    saveh:=curh;
				    curh:=leaderwd*(curh DIV leaderwd);
				    IF curh<saveh THEN
					curh:=curh+leaderwd;
				    END
				ELSE
				    BEGIN
				    lq:=rulewd DIV leaderwd;
				    lr:=rulewd MOD leaderwd;
				    IF mem[p].hh.b1=101 THEN
					curh:=curh+(lr DIV 2)
				    ELSE
					BEGIN
					lx:=(2*lr+lq+1)
					DIV(2*lq+2);
					leaderwd:=leaderwd+lx;
					curh:=curh+((lr-(lq-1)*lx)DIV 2);
					END;
				    END;
				WHILE curh+leaderwd<=edge DO{541}
				    BEGIN
				    curv:=baseline+mem[leaderbox+4].
				    int;
				    IF curv<>dviv THEN
					BEGIN
					Movement(curv-dviv,157);
					dviv:=curv;
					END;
				    savev:=dviv;
				    IF curh<>dvih THEN
					BEGIN
					Movement(curh-dvih,143);
					dvih:=curh;
					END;
				    saveh:=dvih;
				    BEGIN
				    dvibuf[dviptr]:=141;
				    dviptr:=dviptr+1;
				    IF dviptr=dvilimit THEN
					Dviswap;
				    END;
				    tempptr:=leaderbox;
				    outerdoingle:=doingleaders;
				    doingleaders:=true;
				    IF mem[leaderbox].hh.b0=1 THEN
					Vlistout
				    ELSE
					Hlistout;
				    doingleaders:=outerdoingle;
				    BEGIN
				    dvibuf[dviptr]:=142;
				    dviptr:=dviptr+1;
				    IF dviptr=dvilimit THEN
					Dviswap;
				    END;
				    dviv:=savev;
				    dvih:=saveh;
				    curv:=savev;
				    curh:=saveh+leaderwd;
				    END;
				curh:=edge;
				GOTO 15;
				END;
			    END;
			GOTO 13;
			END;
		    11,9:curh:=curh+mem[p+1].int;
		    6:{563}BEGIN
			mem[10011]:=mem[p+1];
			mem[10011].hh.rh:=mem[p].hh.rh;
			p:=10011;
			GOTO 21;
			END;
		    OTHERS:
		    END;
		GOTO 15;
    14:{537}
		IF(ruleht=-1073741824)THEN
		    ruleht:=mem[thisbox+3].int;
		IF(ruledp=-1073741824)THEN
		    ruledp:=mem[thisbox+2].int;
		ruleht:=ruleht+ruledp;
		IF(ruleht>0)AND(rulewd>0)THEN
		    BEGIN
		    IF curh<>dvih THEN
			BEGIN
			Movement(
				 curh-dvih,143);
			dvih:=curh;
			END;
		    curv:=baseline+ruledp;
		    IF curv<>dviv THEN
			BEGIN
			Movement(curv-dviv,157);
			dviv:=curv;
			END;
		    BEGIN
		    dvibuf[dviptr]:=132;
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			Dviswap;
		    END;
		    Dvifour(ruleht);
		    Dvifour(rulewd);
		    curv:=baseline;
		    dvih:=dvih+rulewd;
		    END;
    13:
		curh:=curh+rulewd;
    15:
		p:=mem[p].hh.rh;
		END;
    Prunemovemen(saveloc);
    curs:=curs-1;
    END;

{542}PROCEDURE Vlistout;
    LABEL
	13,14,15;
    VAR
	leftedge:scaled;
	saveh,savev:scaled;
	thisbox:halfword;
	gorder:glueord;
	gsign:0..2;
	p:halfword;
	saveloc:integer;
	leaderbox:halfword;
	leaderht:scaled;
	outerdoingle:boolean;
	edge:scaled;
    BEGIN
    thisbox:=tempptr;
    gorder:=mem[thisbox+5].hh.b1;
    gsign:=mem[thisbox+5].hh.b0;
    p:=mem[thisbox+5].hh.rh;
    curs:=curs+1;
    IF curs>maxpush THEN
	maxpush:=curs;
    saveloc:=dvioffset+dviptr;
    leftedge:=curh;
    curv:=curv-mem[thisbox+3].int;
    WHILE p<>0 DO{543}
	BEGIN
	IF(p>10000)THEN
	    Confusion(586)
	ELSE
	    {544}
	    BEGIN
	    CASE mem[p].hh.b0 OF
		0,1:{545}IF mem[p+5].hh.rh=0 THEN
			     curv:=curv+mem[p
					    +3].int+mem[p+2].int
			 ELSE
			     BEGIN
			     curv:=curv+mem[p+3].int;
			     IF curv<>dviv THEN
				 BEGIN
				 Movement(curv-dviv,157);
				 dviv:=curv;
				 END;
			     saveh:=dvih;
			     savev:=dviv;
			     BEGIN
			     dvibuf[dviptr]:=141;
			     dviptr:=dviptr+1;
			     IF dviptr=dvilimit THEN
				 Dviswap;
			     END;
			     curh:=leftedge+mem[p+4].int;
			     tempptr:=p;
			     IF mem[p].hh.b0=1 THEN
				 Vlistout
			     ELSE
				 Hlistout;
			     BEGIN
			     dvibuf[dviptr]:=142;
			     dviptr:=dviptr+1;
			     IF dviptr=dvilimit THEN
				 Dviswap;
			     END;
			     dvih:=saveh;
			     dviv:=savev;
			     curv:=savev+mem[p+2].int;
			     curh:=leftedge;
			     END;
		2:BEGIN
		    ruleht:=mem[p+3].int;
		    ruledp:=mem[p+2].int;
		    rulewd:=mem[p+1].int;
		    GOTO 14;
		    END;
		8:{1243}Outwhat(p);
		10:{547}BEGIN
		    g:=mem[p+1].hh.lh;
		    ruleht:=mem[g+1].int;
		    IF gsign<>0 THEN
			BEGIN
			IF gsign=1 THEN
			    BEGIN
			    IF mem[g].hh.b0=gorder THEN
				ruleht:=ruleht+Round(mem[thisbox+6].gr*mem[g+2].int);
			    END
			ELSE
			    BEGIN
			    IF mem[g].hh.b1=gorder THEN
				ruleht:=ruleht-Round(mem[
							 thisbox+6].gr*mem[g+3].int);
			    END;
			END;
		    IF mem[p].hh.b1>=100 THEN
			{548}
			BEGIN
			leaderbox:=mem[p+1].hh.rh;
			IF mem[leaderbox].hh.b0=2 THEN
			    BEGIN
			    rulewd:=mem[leaderbox+1].int;
			    ruledp:=0;
			    GOTO 14;
			    END;
			leaderht:=mem[leaderbox+3].int+mem[leaderbox+2].int;
			IF(leaderht>0)AND(ruleht>0)THEN
			    BEGIN
			    edge:=curv+ruleht;
			    {549}
			    IF mem[p].hh.b1=100 THEN
				BEGIN
				savev:=curv;
				curv:=leaderht*(curv DIV leaderht);
				IF curv<savev THEN
				    curv:=curv+leaderht;
				END
			    ELSE
				BEGIN
				lq:=ruleht DIV leaderht;
				lr:=ruleht MOD leaderht;
				IF mem[p].hh.b1=101 THEN
				    curv:=curv+(lr DIV 2)
				ELSE
				    BEGIN
				    lx:=(2*lr+lq+1)
				    DIV(2*lq+2);
				    leaderht:=leaderht+lx;
				    curv:=curv+((lr-(lq-1)*lx)DIV 2);
				    END;
				END;
			    WHILE curv+leaderht<=edge DO{550}
				BEGIN
				curh:=leftedge+mem[leaderbox+4].
				int;
				IF curh<>dvih THEN
				    BEGIN
				    Movement(curh-dvih,143);
				    dvih:=curh;
				    END;
				saveh:=dvih;
				curv:=curv+mem[leaderbox+3].int;
				IF curv<>dviv THEN
				    BEGIN
				    Movement(curv-dviv,157);
				    dviv:=curv;
				    END;
				savev:=dviv;
				BEGIN
				dvibuf[dviptr]:=141;
				dviptr:=dviptr+1;
				IF dviptr=dvilimit THEN
				    Dviswap;
				END;
				tempptr:=leaderbox;
				outerdoingle:=doingleaders;
				doingleaders:=true;
				IF mem[leaderbox].hh.b0=1 THEN
				    Vlistout
				ELSE
				    Hlistout;
				doingleaders:=outerdoingle;
				BEGIN
				dvibuf[dviptr]:=142;
				dviptr:=dviptr+1;
				IF dviptr=dvilimit THEN
				    Dviswap;
				END;
				dviv:=savev;
				dvih:=saveh;
				curh:=saveh;
				curv:=savev-mem[leaderbox+3].int+leaderht;
				END;
			    curv:=edge;
			    GOTO 15;
			    END;
			END;
		    GOTO 13;
		    END;
		11:curv:=curv+mem[p+1].int;
		OTHERS:
		END;
	    GOTO 15;
    14:{546}
	    IF(rulewd=-1073741824)THEN
		rulewd:=mem[thisbox+1].int;
	    ruleht:=ruleht+ruledp;
	    curv:=curv+ruleht;
	    IF(ruleht>0)AND(rulewd>0)THEN
		BEGIN
		IF curh<>dvih THEN
		    BEGIN
		    Movement(
			     curh-dvih,143);
		    dvih:=curh;
		    END;
		IF curv<>dviv THEN
		    BEGIN
		    Movement(curv-dviv,157);
		    dviv:=curv;
		    END;
		BEGIN
		dvibuf[dviptr]:=137;
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    Dviswap;
		END;
		Dvifour(ruleht);
		Dvifour(rulewd);
		END;
	    GOTO 15;
    13:
	    curv:=curv+ruleht;
	    END;
    15:
	p:=mem[p].hh.rh;
	END;
    Prunemovemen(saveloc);
    curs:=curs-1;
    END;

{551}PROCEDURE Shipout(p:halfword);
    VAR
	pageloc:integer;
	k:0..9;
    BEGIN
    IF eqtb[3615].int=0 THEN
	BEGIN
	IF termoffset>maxprintline-9 THEN
	    Println
	ELSE
	    Printchar(32);
	Printchar(91);
	Printint(eqtb[3622].int);
	Break(termout);
	END
    ELSE
	BEGIN
	Printnl(226);
	Println;
	Print(587);
	FOR k:=0 TO 9 DO
	    BEGIN
	    Printint(eqtb[3622+k].int);
	    IF k<9 THEN
		Printchar(46);
	    END;
	Printchar(93);
	Begindiagnos;
	Showbox(p);
	Enddiagnosti(true);
	END;
    {553}
    IF mem[p+3].int+mem[p+2].int>maxv THEN
	maxv:=mem[p+3].int+mem[p+2].
	int;
    IF mem[p+1].int>maxh THEN
	maxh:=mem[p+1].int;
    {530}dvih:=0;
    dviv:=0;
    curh:=0;
    dvif:=0;
    curs:=-1;
    IF outputfilena=0 THEN
	BEGIN
	IF jobname=0 THEN
	    Openlogfile;
	Packjobname(554);
	WHILE NOT Bopenout(dvifile)DO Promptfilena(555,554);
	outputfilena:=Bmakenamestr(dvifile);
	END;
    ;
    pageloc:=dvioffset+dviptr;
    BEGIN
    dvibuf[dviptr]:=139;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    FOR k:=0 TO 9 DO Dvifour(eqtb[3622+k].int);
    Dvifour(lastbop);
    lastbop:=pageloc;
    curv:=mem[p+3].int;
    tempptr:=p;
    IF mem[p].hh.b0=1 THEN
	Vlistout
    ELSE
	Hlistout;
    BEGIN
    dvibuf[dviptr]:=140;
    dviptr:=dviptr+1;
    IF dviptr=dvilimit THEN
	Dviswap;
    END;
    totalpages:=totalpages+1;
    deadcycles:=0;
    IF eqtb[3615].int=0 THEN
	Printchar(93);
    Break(termout);
    {552}
    IF eqtb[3614].int>1 THEN
	BEGIN
	Printnl(588);
	Printint(varused);
	Printchar(38);
	Printint(dynused);
	Printchar(59);
	END;
    Flushnodelis(p);
    IF eqtb[3614].int>1 THEN
	BEGIN
	Print(589);
	Printint(varused);
	Printchar(38);
	Printint(dynused);
	Print(590);
	Printint(maxvarused);
	Printchar(38);
	Printint(memend-9999);
	Println;
	END;
    ;
    END;
    {558}
PROCEDURE Scanspec;
    LABEL
	40;
    BEGIN
    IF Scankeyword(596)THEN
	savestack[saveptr+0].int:=0
    ELSE
	IF
	    Scankeyword(597)THEN
	    savestack[saveptr+0].int:=1
	ELSE
	    BEGIN
	    savestack[
		      saveptr+0].int:=1;
	    savestack[saveptr+1].int:=0;
	    GOTO 40;
	    END;
    Scandimen(false,false,false);
    savestack[saveptr+1].int:=curval;
    40:
    saveptr:=saveptr+2;
    Scanleftbrac;
    END;
    {560}
FUNCTION Hpack(p:halfword;
	       w:scaled;
	       m:smallnumber):halfword;
    LABEL
	21,50,10;
    VAR
	r:halfword;
	q:halfword;
	h,d,x:scaled;
	s:scaled;
	g:halfword;
	o:glueord;
	f:internalfont;
	i:fourquarters;
	hd:quarterword;
	t:halfword;
	b:integer;
    BEGIN
    r:=Getnode(7);
    mem[r].hh.b0:=0;
    mem[r].hh.b1:=0;
    mem[r+4].int:=0;
    q:=r+5;
    mem[q].hh.rh:=p;
    t:=10005;
    h:=0;
    {561}d:=0;
    x:=0;
    FOR o:=0 TO 3 DO
	BEGIN
	totalstretch[o]:=0;
	totalshrink[o]:=0;
	END;
    WHILE p<>0 DO{562}
	BEGIN
    21:
	WHILE(p>10000)DO{565}
	    BEGIN
	    f:=mem[p].hh.b0;
	    i:=fontinfo[charbase[f]+mem[p].hh.b1].qqqq;
	    hd:=i.b1;
	    x:=x+fontinfo[widthbase[f]+i.b0].int;
	    s:=fontinfo[heightbase[f]+hd DIV 16].int;
	    IF s>h THEN
		h:=s;
	    s:=fontinfo[depthbase[f]+hd MOD 16].int;
	    IF s>d THEN
		d:=s;
	    p:=mem[p].hh.rh;
	    END;
	IF p<>0 THEN
	    BEGIN
	    CASE mem[p].hh.b0 OF
		0,1,2,13:{564}BEGIN
		    x:=x+mem[p+1
			     ].int;
		    IF mem[p].hh.b0>=2 THEN
			s:=0
		    ELSE
			s:=mem[p+4].int;
		    IF mem[p+3].int-s>h THEN
			h:=mem[p+3].int-s;
		    IF mem[p+2].int+s>d THEN
			d:=mem[p+2].int+s;
		    END;
		3,4,5:{566}BEGIN
		    WHILE mem[q].hh.rh<>p DO q:=mem[q].hh.rh;
		    IF mem[p].hh.b0=5 THEN
			BEGIN
			mem[t].hh.rh:=mem[p+1].int;
			WHILE mem[t].hh.rh<>0 DO t:=mem[t].hh.rh;
			p:=mem[p].hh.rh;
			Freenode(mem[q].hh.rh,2);
			END
		    ELSE
			BEGIN
			mem[t].hh.rh:=p;
			t:=p;
			p:=mem[p].hh.rh;
			END;
		    mem[q].hh.rh:=p;
		    p:=q;
		    END;
		8:{1238};
		10:{567}BEGIN
		    g:=mem[p+1].hh.lh;
		    x:=x+mem[g+1].int;
		    o:=mem[g].hh.b0;
		    totalstretch[o]:=totalstretch[o]+mem[g+2].int;
		    o:=mem[g].hh.b1;
		    totalshrink[o]:=totalshrink[o]+mem[g+3].int;
		    END;
		11,9:x:=x+mem[p+1].int;
		6:{563}BEGIN
		    mem[10011]:=mem[p+1];
		    mem[10011].hh.rh:=mem[p].hh.rh;
		    p:=10011;
		    GOTO 21;
		    END;
		OTHERS:
		END;
	    p:=mem[p].hh.rh;
	    END;
	END;
    mem[t].hh.rh:=0;
    mem[r+3].int:=h;
    mem[r+2].int:=d;
    {568}
    IF m=1 THEN
	w:=x+w;
    mem[r+1].int:=w;
    x:=w-x;
    IF x=0 THEN
	BEGIN
	mem[r+5].hh.b0:=0;
	mem[r+5].hh.b1:=0;
	mem[r+6].gr:=0.0;
	GOTO 10;
	END
    ELSE
	IF x>0 THEN
	    {569}
	    BEGIN{570}
	    IF totalstretch[3]<>0 THEN
		o:=3
	    ELSE
		IF totalstretch[2]<>0 THEN
		    o:=2
		ELSE
		    IF totalstretch[1]<>0 THEN
			o:=1
		    ELSE
			o:=0;
	    mem[r+5].hh.b1:=o;
	    mem[r+5].hh.b0:=1;
	    IF totalstretch[o]=0 THEN
		mem[r+6].gr:=0.0
	    ELSE
		mem[r+6].gr:=x/
		totalstretch[o];
	    IF(eqtb[3609].int<10000)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		{571}
		BEGIN
		b:=
		Badness(x,totalstretch[0]);
		IF b>eqtb[3609].int THEN
		    BEGIN
		    Println;
		    IF b>100 THEN
			Printnl(598)
		    ELSE
			Printnl(599);
		    Print(600);
		    Printint(b);
		    GOTO 50;
		    END;
		END;
	    GOTO 10;
	    END
	ELSE
	    {575}
	    BEGIN{576}
	    IF totalshrink[3]<>0 THEN
		o:=3
	    ELSE
		IF
		    totalshrink[2]<>0 THEN
		    o:=2
		ELSE
		    IF totalshrink[1]<>0 THEN
			o:=1
		    ELSE
			o:=
			0;
	    mem[r+5].hh.b1:=o;
	    mem[r+5].hh.b0:=2;
	    IF totalshrink[o]=0 THEN
		mem[r+6].gr:=0.0
	    ELSE
		mem[r+6].gr:=-x/
		totalshrink[o];
	    IF(totalshrink[o]<-x)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		BEGIN
		mem[r+6].
		gr:=1.0;
		{577}
		IF-x-totalshrink[0]>eqtb[4014].int THEN
		    BEGIN
		    IF eqtb[4022].int>0
		    THEN
			BEGIN
			WHILE mem[q].hh.rh<>0 DO q:=mem[q].hh.rh;
			mem[q].hh.rh:=Newrule;
			mem[mem[q].hh.rh+1].int:=eqtb[4022].int;
			END;
		    Println;
		    Printnl(605);
		    Printscaled(-x-totalshrink[0]);
		    Print(606);
		    GOTO 50;
		    END;
		END
	    ELSE
		IF(eqtb[3609].int<100)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		    {578}
		    BEGIN
		    b:=Badness(-x,totalshrink[0]);
		    IF b>eqtb[3609].int THEN
			BEGIN
			Println;
			Printnl(607);
			Printint(b);
			GOTO 50;
			END;
		    END;
	    GOTO 10;
	    END;
    50:{574}
    IF outputactive THEN
	Print(601)
    ELSE
	BEGIN
	IF parbeginline<>0
	THEN
	    BEGIN
	    Print(602);
	    Printint(parbeginline);
	    Print(603);
	    END
	ELSE
	    Print(604);
	Printint(line);
	END;
    Println;
    fontinshortd:=0;
    Shortdisplay(mem[r+5].hh.rh);
    Println;
    Begindiagnos;
    Showbox(r);
    Enddiagnosti(true);
    10:
    Hpack:=r;
    END;
    {579}
FUNCTION Vpackage(p:halfword;
		  h:scaled;
		  m:smallnumber;
		  l:scaled):halfword;
    LABEL
	50,10;
    VAR
	r:halfword;
	w,d,x:scaled;
	s:scaled;
	g:halfword;
	o:glueord;
	b:integer;
    BEGIN
    r:=Getnode(7);
    mem[r].hh.b0:=1;
    mem[r].hh.b1:=0;
    mem[r+4].int:=0;
    mem[r+5].hh.rh:=p;
    w:=0;
    {561}d:=0;
    x:=0;
    FOR o:=0 TO 3 DO
	BEGIN
	totalstretch[o]:=0;
	totalshrink[o]:=0;
	END;
    WHILE p<>0 DO{580}
	BEGIN
	IF(p>10000)THEN
	    Confusion(608)
	ELSE
	    CASE mem[p].
		hh.b0 OF
		0,1,2,13:{581}BEGIN
		    x:=x+d+mem[p+3].int;
		    d:=mem[p+2].int;
		    IF mem[p].hh.b0>=2 THEN
			s:=0
		    ELSE
			s:=mem[p+4].int;
		    IF mem[p+1].int+s>w THEN
			w:=mem[p+1].int+s;
		    END;
		8:{1237};
		10:BEGIN
		    x:=x+d;
		    d:=0;
		    {567}
		    BEGIN
		    g:=mem[p+1].hh.lh;
		    x:=x+mem[g+1].int;
		    o:=mem[g].hh.b0;
		    totalstretch[o]:=totalstretch[o]+mem[g+2].int;
		    o:=mem[g].hh.b1;
		    totalshrink[o]:=totalshrink[o]+mem[g+3].int;
		    END;
		    END;
		11:BEGIN
		    x:=x+d+mem[p+1].int;
		    d:=0;
		    END;
		OTHERS:
		END;
	p:=mem[p].hh.rh;
	END;
    mem[r+1].int:=w;
    IF d>l THEN
	BEGIN
	x:=x+d-l;
	mem[r+2].int:=l;
	END
    ELSE
	mem[r+2].int:=d;
    {582}
    IF m=1 THEN
	h:=x+h;
    mem[r+3].int:=h;
    x:=h-x;
    IF x=0 THEN
	BEGIN
	mem[r+5].hh.b0:=0;
	mem[r+5].hh.b1:=0;
	mem[r+6].gr:=0.0;
	GOTO 10;
	END
    ELSE
	IF x>0 THEN
	    {583}
	    BEGIN{570}
	    IF totalstretch[3]<>0 THEN
		o:=3
	    ELSE
		IF totalstretch[2]<>0 THEN
		    o:=2
		ELSE
		    IF totalstretch[1]<>0 THEN
			o:=1
		    ELSE
			o:=0;
	    mem[r+5].hh.b1:=o;
	    mem[r+5].hh.b0:=1;
	    IF totalstretch[o]=0 THEN
		mem[r+6].gr:=0.0
	    ELSE
		mem[r+6].gr:=x/
		totalstretch[o];
	    IF(eqtb[3610].int<10000)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		{584}
		BEGIN
		b:=
		Badness(x,totalstretch[0]);
		IF b>eqtb[3610].int THEN
		    BEGIN
		    Println;
		    IF b>100 THEN
			Printnl(598)
		    ELSE
			Printnl(599);
		    Print(609);
		    Printint(b);
		    GOTO 50;
		    END;
		END;
	    GOTO 10;
	    END
	ELSE
	    {586}
	    BEGIN{576}
	    IF totalshrink[3]<>0 THEN
		o:=3
	    ELSE
		IF
		    totalshrink[2]<>0 THEN
		    o:=2
		ELSE
		    IF totalshrink[1]<>0 THEN
			o:=1
		    ELSE
			o:=
			0;
	    mem[r+5].hh.b1:=o;
	    mem[r+5].hh.b0:=2;
	    IF totalshrink[o]=0 THEN
		mem[r+6].gr:=0.0
	    ELSE
		mem[r+6].gr:=-x/
		totalshrink[o];
	    IF(totalshrink[o]<-x)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		BEGIN
		mem[r+6].
		gr:=1.0;
		{587}
		IF-x-totalshrink[0]>eqtb[4015].int THEN
		    BEGIN
		    Println;
		    Printnl(610);
		    Printscaled(-x-totalshrink[0]);
		    Print(611);
		    GOTO 50;
		    END;
		END
	    ELSE
		IF(eqtb[3610].int<100)AND(o=0)AND(mem[r+5].hh.rh<>0)THEN
		    {588}
		    BEGIN
		    b:=Badness(-x,totalshrink[0]);
		    IF b>eqtb[3610].int THEN
			BEGIN
			Println;
			Printnl(612);
			Printint(b);
			GOTO 50;
			END;
		    END;
	    GOTO 10;
	    END;
    50:{585}
    IF outputactive THEN
	Print(601)
    ELSE
	BEGIN
	Print(604);
	Printint(line);
	Println;
	END;
    Begindiagnos;
    Showbox(r);
    Enddiagnosti(true);
    10:
    Vpackage:=r;
    END;
    {589}
PROCEDURE Appendtovlis(b:halfword);
    VAR
	d:scaled;
	p:halfword;
    BEGIN
    IF curlist.auxfield<>-65536000 THEN
	BEGIN
	d:=mem[eqtb[2363].hh.rh
	       +1].int-curlist.auxfield-mem[b+3].int;
	IF d<eqtb[4009].int THEN
	    p:=Newparamglue(0)
	ELSE
	    BEGIN
	    p:=Newskipparam(1)
	    ;
	    mem[tempptr+1].int:=d;
	    END;
	mem[curlist.tailfield].hh.rh:=p;
	curlist.tailfield:=p;
	END;
    mem[curlist.tailfield].hh.rh:=b;
    curlist.tailfield:=b;
    curlist.auxfield:=mem[b+2].int;
    END;
    {596}
FUNCTION Newnoad:halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(4);
    mem[p].hh.b0:=22;
    mem[p].hh.b1:=0;
    mem[p+1].hh:=emptyfield;
    mem[p+3].hh:=emptyfield;
    mem[p+2].hh:=emptyfield;
    Newnoad:=p;
    END;
    {598}
FUNCTION Newstyle(s:smallnumber):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Getnode(2);
    mem[p].hh.b0:=14;
    mem[p].hh.b1:=s;
    mem[p+1].int:=0;
    Newstyle:=p;
    END;

{602}PROCEDURE Showinfo;
    BEGIN
    Shownodelist(mem[tempptr].hh.lh);
    END;
    {611}
FUNCTION Fractionrule(t:scaled):halfword;
    VAR
	p:halfword;
    BEGIN
    p:=Newrule;
    mem[p+3].int:=t;
    mem[p+2].int:=0;
    Fractionrule:=p;
    END;
    {612}
FUNCTION Overbar(b:halfword;
		 k,t:scaled):halfword;
    VAR
	p,q:halfword;
    BEGIN
    p:=Newkern(k);
    mem[p].hh.rh:=b;
    q:=Fractionrule(t);
    mem[q].hh.rh:=p;
    p:=Newkern(t);
    mem[p].hh.rh:=q;
    Overbar:=Vpackage(p,0,1,1073741823);
    END;
    {613}{616}
FUNCTION Charbox(f:internalfont;
		 c:quarterword):halfword;
    VAR
	q:fourquarters;
	hd:eightbits;
	b,p:halfword;
    BEGIN
    q:=fontinfo[charbase[f]+c].qqqq;
    hd:=q.b1;
    b:=Newnullbox;
    mem[b+1].int:=fontinfo[widthbase[f]+q.b0].int+fontinfo[italicbase[f]+q.
							   b2 DIV 4].int;
    mem[b+3].int:=fontinfo[heightbase[f]+hd DIV 16].int;
    mem[b+2].int:=fontinfo[heightbase[f]+hd DIV 16].int;
    p:=Getavail;
    mem[p].hh.b1:=c;
    mem[p].hh.b0:=f;
    mem[b+5].hh.rh:=p;
    Charbox:=b;
    END;
    {618}
PROCEDURE Stackintobox(b:halfword;
		       f:internalfont;
		       c:quarterword);
    VAR
	p:halfword;
    BEGIN
    p:=Charbox(f,c);
    mem[p].hh.rh:=mem[b+5].hh.rh;
    mem[b+5].hh.rh:=p;
    mem[b+3].int:=mem[p+3].int;
    END;
    {619}
FUNCTION Heightplusde(f:internalfont;
		      c:quarterword):scaled;
    VAR
	q:fourquarters;
	hd:eightbits;
    BEGIN
    q:=fontinfo[charbase[f]+c].qqqq;
    hd:=q.b1;
    Heightplusde:=fontinfo[heightbase[f]+hd DIV 16].int+fontinfo[depthbase[f
									   ]+hd MOD 16].int;
    END;
FUNCTION Vardelimiter(d:halfword;
		      s:smallnumber;
		      v:scaled):halfword;
    LABEL
	40,22;
    VAR
	b:halfword;
	f,g:internalfont;
	c,x,y:quarterword;
	m,n:integer;
	u:scaled;
	w:scaled;
	q:fourquarters;
	hd:eightbits;
	r:fourquarters;
	p:halfword;
	z:smallnumber;
	largeattempt:boolean;
    BEGIN
    f:=0;
    w:=0;
    largeattempt:=false;
    z:=mem[d].qqqq.b0;
    x:=mem[d].qqqq.b1;
    WHILE true DO
	BEGIN{614}
	IF(z<>0)OR(x<>0)THEN
	    BEGIN
	    z:=z+s+16;
	    REPEAT
		z:=z-16;
		g:=eqtb[2895+z].hh.rh;
		IF g<>0 THEN
		    {615}
		    BEGIN
		    y:=x;
    22:
		    IF(y>=fontbc[g])AND(y<=fontec[g])THEN
			BEGIN
			q:=fontinfo[charbase[g]+y
				    ].qqqq;
			IF(q.b0>0)THEN
			    BEGIN
			    IF(q.b2 MOD 4)=3 THEN
				BEGIN
				f:=g;
				c:=y;
				GOTO 40;
				END;
			    hd:=q.b1;
			    u:=fontinfo[heightbase[g]+hd DIV 16].int+fontinfo[depthbase[g]+hd MOD 16
									      ].int;
			    IF u>w THEN
				BEGIN
				f:=g;
				c:=y;
				w:=u;
				IF u>=v THEN
				    GOTO 40;
				END;
			    IF(q.b2 MOD 4)=2 THEN
				BEGIN
				y:=q.b3;
				GOTO 22;
				END;
			    END;
			END;
		    END;
	    UNTIL z<16;
	    END;
	IF largeattempt THEN
	    GOTO 40;
	largeattempt:=true;
	z:=mem[d].qqqq.b2;
	x:=mem[d].qqqq.b3;
	END;
    40:
    IF f<>0 THEN
	{617}
	IF(q.b2 MOD 4)=3 THEN
	    {620}
	    BEGIN
	    b:=Newnullbox;
	    mem[b].hh.b0:=1;
	    r:=fontinfo[extenbase[f]+q.b3].qqqq;
	    {621}c:=r.b3;
	    u:=Heightplusde(f,c);
	    w:=0;
	    q:=fontinfo[charbase[f]+c].qqqq;
	    mem[b+1].int:=fontinfo[widthbase[f]+q.b0].int+fontinfo[italicbase[f]+q.
								   b2 DIV 4].int;
	    c:=r.b2;
	    IF c<>0 THEN
		w:=w+Heightplusde(f,c);
	    c:=r.b1;
	    IF c<>0 THEN
		w:=w+Heightplusde(f,c);
	    c:=r.b0;
	    IF c<>0 THEN
		w:=w+Heightplusde(f,c);
	    n:=0;
	    IF u>0 THEN
		WHILE w<v DO
		    BEGIN
		    w:=w+u;
		    n:=n+1;
		    IF r.b1<>0 THEN
			w:=w+u;
		    END;
	    c:=r.b2;
	    IF c<>0 THEN
		Stackintobox(b,f,c);
	    c:=r.b3;
	    FOR m:=1 TO n DO Stackintobox(b,f,c);
	    c:=r.b1;
	    IF c<>0 THEN
		BEGIN
		Stackintobox(b,f,c);
		c:=r.b3;
		FOR m:=1 TO n DO Stackintobox(b,f,c);
		END;
	    c:=r.b0;
	    IF c<>0 THEN
		Stackintobox(b,f,c);
	    mem[b+2].int:=w-mem[b+3].int;
	    END
	ELSE
	    b:=Charbox(f,c)
    ELSE
	BEGIN
	b:=Newnullbox;
	mem[b+1].int:=eqtb[4017].int;
	END;
    mem[b+4].int:=Half(mem[b+3].int-mem[b+2].int)-fontinfo[22+parambase[eqtb
									[2897+s].hh.rh]].int;
    Vardelimiter:=b;
    END;
    {622}
FUNCTION Rebox(b:halfword;
	       w:scaled):halfword;
    VAR
	p:halfword;
    BEGIN
    IF(mem[b+1].int<>w)AND(mem[b+5].hh.rh<>0)THEN
	BEGIN
	p:=mem[b+5].hh
	.rh;
	Freenode(b,7);
	b:=Newglue(12);
	mem[b].hh.rh:=p;
	WHILE mem[p].hh.rh<>0 DO p:=mem[p].hh.rh;
	mem[p].hh.rh:=Newglue(12);
	Rebox:=Hpack(b,w,0);
	END
    ELSE
	BEGIN
	mem[b+1].int:=w;
	Rebox:=b;
	END;
    END;
    {623}
FUNCTION Mathglue(g:halfword;
		  m:scaled):halfword;
    VAR
	p:halfword;
	n:integer;
	f:scaled;
    BEGIN
    n:=Xovern(m,65536);
    f:=remainder;
    p:=Getnode(4);
    mem[p+1].int:=Nxplusy(n,mem[g+1].int,Xnoverd(mem[g+1].int,f,65536));
    mem[p].hh.b0:=mem[g].hh.b0;
    IF mem[p].hh.b0=0 THEN
	mem[p+2].int:=Nxplusy(n,mem[g+2].int,Xnoverd(mem[
							 g+2].int,f,65536))
    ELSE
	mem[p+2].int:=mem[g+2].int;
    mem[p].hh.b1:=mem[g].hh.b1;
    IF mem[p].hh.b1=0 THEN
	mem[p+3].int:=Nxplusy(n,mem[g+3].int,Xnoverd(mem[
							 g+3].int,f,65536))
    ELSE
	mem[p+3].int:=mem[g+3].int;
    Mathglue:=p;
    END;
    {624}
PROCEDURE Mathkern(p:halfword;
		   m:scaled);
    VAR
	n:integer;
	f:scaled;
    BEGIN
    IF mem[p].hh.b1=99 THEN
	BEGIN
	n:=Xovern(m,65536);
	f:=remainder;
	mem[p+1].int:=Nxplusy(n,mem[p+1].int,Xnoverd(mem[p+1].int,f,65536));
	mem[p].hh.b1:=0;
	END;
    END;
    {626}
PROCEDURE Mlisttohlist;
    FORWARD;
FUNCTION Cleanbox(p:halfword;
		  s:smallnumber):halfword;
    LABEL
	40,10;
    VAR
	q:halfword;
	savestyle:smallnumber;
    BEGIN
    CASE mem[p].hh.rh OF
	1:BEGIN
	    curmlist:=Newnoad;
	    mem[curmlist+1]:=mem[p];
	    mem[curmlist].hh.b0:=15;
	    END;
	2:BEGIN
	    q:=mem[p].hh.lh;
	    IF mem[q+4].int=0 THEN
		BEGIN
		Cleanbox:=q;
		GOTO 10;
		END
	    ELSE
		GOTO 40;
	    END;
	3:curmlist:=mem[p].hh.lh;
	OTHERS:BEGIN
	    q:=0;
	    GOTO 40;
	    END
	END;
    savestyle:=curstyle;
    curstyle:=s;
    mlistpenalti:=false;
    Mlisttohlist;
    q:=mem[10003].hh.rh;
    curstyle:=savestyle;
    {610}
    BEGIN
    IF curstyle<4 THEN
	cursize:=0
    ELSE
	cursize:=16*((curstyle-2)
		     DIV 2);
    curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
    END;
    40:
    Cleanbox:=Hpack(q,0,1);
    10:
    END;
    {627}
PROCEDURE Fetch(a:halfword);
    BEGIN
    curc:=mem[a].hh.b1;
    curf:=eqtb[2895+mem[a].hh.b0+cursize].hh.rh;
    IF curf=0 THEN
	{628}
	BEGIN
	Printnl(639);
	Printsize(cursize);
	Print(32);
	Printint(mem[a].hh.b0);
	Print(640);
	BEGIN
	helpptr:=3;
	helpline[2]:=641;
	helpline[1]:=642;
	helpline[0]:=643;
	END;
	Error;
	curi:=nullcharacte;
	mem[a].hh.rh:=0;
	END
    ELSE
	BEGIN
	IF(curc>=fontbc[curf])AND(curc<=fontec[curf])THEN
	    curi:=
	    fontinfo[charbase[curf]+curc].qqqq
	ELSE
	    curi:=nullcharacte;
	IF NOT((curi.b0>0))THEN
	    BEGIN
	    Charwarning(curf,curc);
	    mem[a].hh.rh:=0;
	    END;
	END;
    END;
    {631}{637}
PROCEDURE Makeover(q:halfword);
    BEGIN
    mem[q+1].hh.lh:=Overbar(Cleanbox(q+1,2*(curstyle DIV 2)+1),3*
			    fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].int,fontinfo[8+parambase
											 [eqtb[2898+cursize].hh.rh]].int);
    mem[q+1].hh.rh:=2;
    END;
    {638}
PROCEDURE Makeunder(q:halfword);
    VAR
	p,x,y:halfword;
	delta:scaled;
    BEGIN
    x:=Cleanbox(q+1,curstyle);
    p:=Newkern(3*fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].int);
    mem[x].hh.rh:=p;
    mem[p].hh.rh:=Fractionrule(fontinfo[8+parambase[eqtb[2898+cursize].hh.rh
						    ]].int);
    y:=Vpackage(x,0,1,1073741823);
    delta:=mem[y+3].int+mem[y+2].int+fontinfo[8+parambase[eqtb[2898+cursize]
							  .hh.rh]].int;
    mem[y+3].int:=mem[x+3].int;
    mem[y+2].int:=delta-mem[y+3].int;
    mem[q+1].hh.lh:=y;
    mem[q+1].hh.rh:=2;
    END;
    {639}
PROCEDURE Makevcenter(q:halfword);
    VAR
	v:halfword;
	delta:scaled;
    BEGIN
    v:=mem[q+1].hh.lh;
    IF mem[v].hh.b0<>1 THEN
	Confusion(344);
    delta:=mem[v+3].int+mem[v+2].int;
    mem[v+3].int:=fontinfo[22+parambase[eqtb[2897+cursize].hh.rh]].int+Half(
									    delta);
    mem[v+2].int:=mem[v+3].int-delta;
    END;
    {640}
PROCEDURE Makeradical(q:halfword);
    VAR
	x,y:halfword;
	delta,clr:scaled;
    BEGIN
    x:=Cleanbox(q+1,2*(curstyle DIV 2)+1);
    IF curstyle<2 THEN
	clr:=fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].
	int+(fontinfo[5+parambase[eqtb[2897+cursize].hh.rh]].int DIV 4)
    ELSE
	BEGIN
	clr:=fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].int;
	clr:=clr+(clr DIV 4);
	END;
    y:=Vardelimiter(q+4,cursize,mem[x+3].int+mem[x+2].int+clr+fontinfo[8+
								       parambase[eqtb[2898+cursize].hh.rh]].int);
    IF mem[y+3].int<=0 THEN
	mem[y+3].int:=fontinfo[8+parambase[eqtb[2898+
						cursize].hh.rh]].int;
    delta:=mem[y+2].int-(mem[x+3].int+mem[x+2].int+clr);
    IF delta>0 THEN
	clr:=clr+Half(delta);
    mem[y+4].int:=-(mem[x+3].int+clr);
    mem[y].hh.rh:=Overbar(x,clr,mem[y+3].int);
    mem[q+1].hh.lh:=Hpack(y,0,1);
    mem[q+1].hh.rh:=2;
    END;
    {641}
PROCEDURE Makemathacce(q:halfword);
    LABEL
	30;
    VAR
	p,x,y:halfword;
	c:quarterword;
	f:internalfont;
	i:fourquarters;
	delta:scaled;
    BEGIN
    Fetch(q+4);
    IF(curi.b0>0)THEN
	BEGIN
	i:=curi;
	c:=curc;
	f:=curf;
	x:=Cleanbox(q+1,2*(curstyle DIV 2)+1);
	{642}
	WHILE true DO
	    BEGIN
	    IF(i.b2 MOD 4)<>2 THEN
		GOTO 30;
	    y:=i.b3;
	    i:=fontinfo[charbase[f]+y].qqqq;
	    IF fontinfo[widthbase[f]+i.b0].int>mem[x+1].int THEN
		GOTO 30;
	    c:=y;
	    END;
    30:;
	delta:=mem[x+3].int-fontinfo[5+parambase[f]].int;
	IF delta<0 THEN
	    delta:=0;
	y:=Charbox(f,c);
	mem[y+4].int:=Half(mem[x+1].int-mem[y+1].int);
	mem[y+1].int:=0;
	p:=Newkern(delta-mem[x+3].int);
	mem[p].hh.rh:=x;
	mem[y].hh.rh:=p;
	y:=Vpackage(y,0,1,1073741823);
	mem[y+1].int:=mem[x+1].int;
	mem[q+1].hh.lh:=y;
	mem[q+1].hh.rh:=2;
	END;
    END;

{643}PROCEDURE Makefraction(q:halfword);
    VAR
	p,v,x,y,z:halfword;
	delta,delta1,delta2,shiftup,shiftdown,clr:scaled;
    BEGIN{644}
    x:=Cleanbox(q+2,curstyle+2-2*(curstyle DIV 6));
    z:=Cleanbox(q+3,2*(curstyle DIV 2)+3-2*(curstyle DIV 6));
    IF mem[x+1].int<mem[z+1].int THEN
	x:=Rebox(x,mem[z+1].int)
    ELSE
	z:=Rebox(
		 z,mem[x+1].int);
    IF curstyle<2 THEN
	BEGIN
	shiftup:=fontinfo[8+parambase[eqtb[2897+cursize
					   ].hh.rh]].int;
	shiftdown:=fontinfo[11+parambase[eqtb[2897+cursize].hh.rh]].int;
	END
    ELSE
	BEGIN
	shiftdown:=fontinfo[12+parambase[eqtb[2897+cursize].hh.rh
					 ]].int;
	IF mem[q+1].int<>0 THEN
	    shiftup:=fontinfo[9+parambase[eqtb[2897+cursize]
					  .hh.rh]].int
	ELSE
	    shiftup:=fontinfo[10+parambase[eqtb[2897+cursize].hh.
					   rh]].int;
	END;
    IF mem[q+1].int=0 THEN
	{645}
	BEGIN
	IF curstyle<2 THEN
	    clr:=7*fontinfo[8+
			    parambase[eqtb[2898+cursize].hh.rh]].int
	ELSE
	    clr:=3*fontinfo[8+
			    parambase[eqtb[2898+cursize].hh.rh]].int;
	delta:=Half(clr-((shiftup-mem[x+2].int)-(mem[z+3].int-shiftdown)));
	IF delta>0 THEN
	    BEGIN
	    shiftup:=shiftup+delta;
	    shiftdown:=shiftdown-delta;
	    END;
	END
    ELSE
	{646}
	BEGIN
	IF mem[q+1].int=1073741824 THEN
	    mem[q+1].int:=
	    fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].int;
	IF curstyle<2 THEN
	    clr:=3*mem[q+1].int
	ELSE
	    clr:=mem[q+1].int;
	delta:=Half(mem[q+1].int);
	delta1:=clr-((shiftup-mem[x+2].int)-(fontinfo[22+parambase[eqtb[2897+
									cursize].hh.rh]].int+delta));
	delta2:=clr-((fontinfo[22+parambase[eqtb[2897+cursize].hh.rh]].int-delta
		      )-(mem[z+3].int-shiftdown));
	IF delta1>0 THEN
	    shiftup:=shiftup+delta1;
	IF delta2>0 THEN
	    shiftdown:=shiftdown+delta2;
	END;
    {647}v:=Newnullbox;
    mem[v].hh.b0:=1;
    mem[v+3].int:=shiftup+mem[x+3].int;
    mem[v+2].int:=mem[z+2].int+shiftdown;
    mem[v+1].int:=mem[x+1].int;
    IF mem[q+1].int=0 THEN
	BEGIN
	p:=Newkern((shiftup-mem[x+2].int)-(mem[z+3]
					   .int-shiftdown));
	mem[p].hh.rh:=z;
	END
    ELSE
	BEGIN
	y:=Fractionrule(mem[q+1].int);
	p:=Newkern((fontinfo[22+parambase[eqtb[2897+cursize].hh.rh]].int-delta)-
		   (mem[z+3].int-shiftdown));
	mem[y].hh.rh:=p;
	mem[p].hh.rh:=z;
	p:=Newkern((shiftup-mem[x+2].int)-(fontinfo[22+parambase[eqtb[2897+
								      cursize].hh.rh]].int+delta));
	mem[p].hh.rh:=y;
	END;
    mem[x].hh.rh:=p;
    mem[v+5].hh.rh:=x;
    {648}
    IF curstyle<2 THEN
	delta:=fontinfo[20+parambase[eqtb[2897+cursize].
				     hh.rh]].int
    ELSE
	delta:=fontinfo[21+parambase[eqtb[2897+cursize].hh.rh]]
	.int;
    x:=Vardelimiter(q+4,cursize,delta);
    mem[x].hh.rh:=v;
    z:=Vardelimiter(q+5,cursize,delta);
    mem[v].hh.rh:=z;
    mem[q+1].int:=Hpack(x,0,1);
    END;
    {649}
FUNCTION Makeop(q:halfword):scaled;
    VAR
	delta:scaled;
	p,v,x,y,z:halfword;
	shiftup,shiftdown:scaled;
    BEGIN
    IF mem[q+1].hh.rh=1 THEN
	BEGIN
	Fetch(q+1);
	IF(curstyle<2)AND((curi.b2 MOD 4)=2)THEN
	    BEGIN
	    curc:=curi.b3;
	    mem[q+1].hh.b1:=curc;
	    curi:=fontinfo[charbase[curf]+curc].qqqq;
	    END;
	delta:=fontinfo[italicbase[curf]+curi.b2 DIV 4].int;
	x:=Cleanbox(q+1,curstyle);
	mem[x+1].int:=mem[x+1].int-delta;
	mem[x+4].int:=Half(mem[x+3].int-mem[x+2].int)-fontinfo[22+parambase[eqtb
									    [2897+cursize].hh.rh]].int;
	mem[q+1].hh.rh:=2;
	mem[q+1].hh.lh:=x;
	END
    ELSE
	delta:=0;
    IF curstyle<2 THEN
	IF((delta=0)AND(mem[q].hh.b1=0))OR((delta<>0)AND(mem[
							     q].hh.b1=1))THEN
	    mem[q].hh.b1:=1
	ELSE
	    mem[q].hh.b1:=0
    ELSE
	mem[q].hh.b1
	:=0;
    IF mem[q].hh.b1=1 THEN
	{650}
	BEGIN
	x:=Cleanbox(q+2,2*(curstyle DIV 4)+4+(
					      curstyle MOD 2));
	y:=Cleanbox(q+1,curstyle);
	z:=Cleanbox(q+3,2*(curstyle DIV 4)+5);
	v:=Newnullbox;
	mem[v].hh.b0:=1;
	mem[v+1].int:=mem[y+1].int;
	IF mem[x+1].int>mem[v+1].int THEN
	    mem[v+1].int:=mem[x+1].int;
	IF mem[z+1].int>mem[v+1].int THEN
	    mem[v+1].int:=mem[z+1].int;
	x:=Rebox(x,mem[v+1].int);
	y:=Rebox(y,mem[v+1].int);
	z:=Rebox(z,mem[v+1].int);
	mem[x+4].int:=Half(delta);
	mem[z+4].int:=-mem[x+4].int;
	mem[v+3].int:=mem[y+3].int;
	mem[v+2].int:=mem[y+2].int;
	{651}
	IF mem[q+2].hh.rh=0 THEN
	    BEGIN
	    Freenode(x,7);
	    mem[v+5].hh.rh:=y;
	    END
	ELSE
	    BEGIN
	    shiftup:=fontinfo[11+parambase[eqtb[2898+cursize].hh.rh]]
	    .int-mem[x+2].int;
	    IF shiftup<fontinfo[9+parambase[eqtb[2898+cursize].hh.rh]].int THEN
		shiftup:=fontinfo[9+parambase[eqtb[2898+cursize].hh.rh]].int;
	    p:=Newkern(shiftup);
	    mem[p].hh.rh:=y;
	    mem[x].hh.rh:=p;
	    p:=Newkern(fontinfo[13+parambase[eqtb[2898+cursize].hh.rh]].int);
	    mem[p].hh.rh:=x;
	    mem[v+5].hh.rh:=p;
	    mem[v+3].int:=mem[v+3].int+fontinfo[13+parambase[eqtb[2898+cursize].hh.
							     rh]].int+mem[x+3].int+mem[x+2].int+shiftup;
	    END;
	IF mem[q+3].hh.rh=0 THEN
	    Freenode(z,7)
	ELSE
	    BEGIN
	    shiftdown:=fontinfo[12+
				parambase[eqtb[2898+cursize].hh.rh]].int-mem[z+3].int;
	    IF shiftdown<fontinfo[10+parambase[eqtb[2898+cursize].hh.rh]].int THEN
		shiftdown:=fontinfo[10+parambase[eqtb[2898+cursize].hh.rh]].int;
	    p:=Newkern(shiftdown);
	    mem[y].hh.rh:=p;
	    mem[p].hh.rh:=z;
	    p:=Newkern(fontinfo[13+parambase[eqtb[2898+cursize].hh.rh]].int);
	    mem[z].hh.rh:=p;
	    mem[v+2].int:=mem[v+2].int+fontinfo[13+parambase[eqtb[2898+cursize].hh.
							     rh]].int+mem[z+3].int+mem[z+2].int+shiftdown;
	    END;
	mem[q+1].int:=v;
	END
    ELSE
	IF(delta<>0)AND(mem[q+3].hh.rh=0)THEN
	    mem[x+1].int:=mem[x+1].
	    int+delta;
    Makeop:=delta;
    END;
    {652}
PROCEDURE Makeord(q:halfword);
    LABEL
	20;
    VAR
	a:integer;
	p:halfword;
    BEGIN
    20:
    IF(mem[q+3].hh.rh=0)AND(mem[q+2].hh.rh=0)AND(mem[q+1].hh.rh=1)
    THEN
	BEGIN
	p:=mem[q].hh.rh;
	IF p<>0 THEN
	    IF(mem[p].hh.b0>=15)AND(mem[p].hh.b0<=21)THEN
		IF mem[p+1].
		hh.rh=1 THEN
		    IF mem[p+1].hh.b0=mem[q+1].hh.b0 THEN
			BEGIN
			Fetch(q+1);
			IF(curi.b2 MOD 4)=1 THEN
			    BEGIN
			    a:=ligkernbase[curf]+curi.b3;
			    curc:=mem[p+1].hh.b1;
			    REPEAT
				curi:=fontinfo[a].qqqq;
				{653}
				IF curi.b1=curc THEN
				    IF curi.b2>=128 THEN
					BEGIN
					p:=Newkern(fontinfo
						   [kernbase[curf]+curi.b3].int);
					mem[p].hh.rh:=mem[q].hh.rh;
					mem[q].hh.rh:=p;
					END
				    ELSE
					BEGIN
					mem[q].hh.rh:=mem[p].hh.rh;
					mem[q+1].hh.b1:=curi.b3;
					mem[q+3]:=mem[p+3];
					mem[q+2]:=mem[p+2];
					Freenode(p,4);
					GOTO 20;
					END;
				a:=a+1;
			    UNTIL curi.b0>=128;
			    END;
			END;
	END;
    END;
    {656}
PROCEDURE Makescripts(q:halfword;
		      delta:scaled);
    VAR
	p,x,y,z:halfword;
	shiftup,shiftdown,clr:scaled;
	t:smallnumber;
    BEGIN
    p:=mem[q+1].int;
    IF(p>10000)THEN
	BEGIN
	shiftup:=0;
	shiftdown:=0;
	END
    ELSE
	BEGIN
	z:=Hpack(p,0,1);
	IF curstyle<4 THEN
	    t:=16
	ELSE
	    t:=32;
	shiftup:=mem[z+3].int-fontinfo[18+parambase[eqtb[2897+t].hh.rh]].int;
	shiftdown:=mem[z+2].int+fontinfo[19+parambase[eqtb[2897+t].hh.rh]].int;
	Freenode(z,7);
	END;
    IF mem[q+2].hh.rh=0 THEN
	{657}
	BEGIN
	x:=Cleanbox(q+3,2*(curstyle DIV 4)+5)
	;
	mem[x+1].int:=mem[x+1].int+eqtb[4018].int;
	IF shiftdown<fontinfo[16+parambase[eqtb[2897+cursize].hh.rh]].int THEN
	    shiftdown:=fontinfo[16+parambase[eqtb[2897+cursize].hh.rh]].int;
	clr:=mem[x+3].int-((fontinfo[5+parambase[eqtb[2897+cursize].hh.rh]].int
			    *4)DIV 5);
	IF shiftdown<clr THEN
	    shiftdown:=clr;
	mem[x+4].int:=shiftdown;
	END
    ELSE
	BEGIN{658}
	BEGIN
	x:=Cleanbox(q+2,2*(curstyle DIV 4)+4+(curstyle
					      MOD 2));
	mem[x+1].int:=mem[x+1].int+eqtb[4018].int;
	IF Odd(curstyle)THEN
	    clr:=fontinfo[15+parambase[eqtb[2897+cursize].hh.rh
				       ]].int
	ELSE
	    IF curstyle<2 THEN
		clr:=fontinfo[13+parambase[eqtb[2897+
						cursize].hh.rh]].int
	    ELSE
		clr:=fontinfo[14+parambase[eqtb[2897+cursize].
					   hh.rh]].int;
	IF shiftup<clr THEN
	    shiftup:=clr;
	clr:=mem[x+2].int+(fontinfo[5+parambase[eqtb[2897+cursize].hh.rh]].int
			   DIV 4);
	IF shiftup<clr THEN
	    shiftup:=clr;
	END;
	IF mem[q+3].hh.rh=0 THEN
	    mem[x+4].int:=-shiftup
	ELSE
	    {659}
	    BEGIN
	    y:=
	    Cleanbox(q+3,2*(curstyle DIV 4)+5);
	    mem[y+1].int:=mem[y+1].int+eqtb[4018].int;
	    IF shiftdown<fontinfo[17+parambase[eqtb[2897+cursize].hh.rh]].int THEN
		shiftdown:=fontinfo[17+parambase[eqtb[2897+cursize].hh.rh]].int;
	    clr:=4*fontinfo[8+parambase[eqtb[2898+cursize].hh.rh]].int-((shiftup-mem
									 [x+2].int)-(mem[y+3].int-shiftdown));
	    IF clr>0 THEN
		BEGIN
		shiftdown:=shiftdown+clr;
		clr:=(4*fontinfo[5+parambase[eqtb[2897+cursize].hh.rh]].int DIV 5)-(
										    shiftup-mem[x+2].int);
		IF clr>0 THEN
		    BEGIN
		    shiftup:=shiftup+clr;
		    shiftdown:=shiftdown-clr;
		    END;
		END;
	    mem[x+4].int:=delta;
	    p:=Newkern((shiftup-mem[x+2].int)-(mem[y+3].int-shiftdown));
	    mem[x].hh.rh:=p;
	    mem[p].hh.rh:=y;
	    x:=Vpackage(x,0,1,1073741823);
	    mem[x+4].int:=shiftdown;
	    END;
	END;
    IF mem[q+1].int=0 THEN
	mem[q+1].int:=x
    ELSE
	BEGIN
	p:=mem[q+1].int;
	WHILE mem[p].hh.rh<>0 DO p:=mem[p].hh.rh;
	mem[p].hh.rh:=x;
	END;
    END;
    {662}
FUNCTION Makeleftrigh(q:halfword;
		      style:smallnumber;
		      maxd,maxh:scaled):smallnumber;
    VAR
	delta,delta1,delta2:scaled;
    BEGIN
    IF style<4 THEN
	cursize:=0
    ELSE
	cursize:=16*((style-2)DIV 2);
    delta2:=maxd+fontinfo[22+parambase[eqtb[2897+cursize].hh.rh]].int;
    delta1:=maxh+maxd-delta2;
    IF delta2>delta1 THEN
	delta1:=delta2;
    delta:=(eqtb[3601].int*delta1)DIV 500;
    delta2:=delta1+delta1-eqtb[4016].int;
    IF delta<delta2 THEN
	delta:=delta2;
    mem[q+1].int:=Vardelimiter(q+1,cursize,delta);
    Makeleftrigh:=mem[q].hh.b0-(10);
    END;
PROCEDURE Mlisttohlist;
    LABEL
	21,82,80,81,83,30;
    VAR
	mlist:halfword;
	penalties:boolean;
	style:smallnumber;
	savestyle:smallnumber;
	q:halfword;
	r:halfword;
	rtype:smallnumber;
	t:smallnumber;
	p,v,x,y,z:halfword;
	pen:integer;
	s:smallnumber;
	maxh,maxd:scaled;
	delta:scaled;
    BEGIN
    mlist:=curmlist;
    penalties:=mlistpenalti;
    style:=curstyle;
    q:=mlist;
    r:=0;
    rtype:=16;
    maxh:=0;
    maxd:=0;
    {610}
    BEGIN
    IF curstyle<4 THEN
	cursize:=0
    ELSE
	cursize:=16*((curstyle-2)
		     DIV 2);
    curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
    END;
    WHILE q<>0 DO{632}
	BEGIN{633}
    21:
	delta:=0;
	CASE mem[q].hh.b0 OF
	    17:CASE rtype OF
		17,16,18,19,21,29:BEGIN
		    mem[q].hh.
		    b0:=15;
		    GOTO 21;
		    END;
		OTHERS:
		END;
	    18,20,21,30:BEGIN
		IF rtype=17 THEN
		    mem[r].hh.b0:=15;
		IF mem[q].hh.b0=30 THEN
		    GOTO 80;
		END;
	    {636}29:GOTO 80;
	    24:BEGIN
		Makefraction(q);
		GOTO 82;
		END;
	    16:BEGIN
		delta:=Makeop(q);
		IF mem[q].hh.b1=1 THEN
		    GOTO 82;
		END;
	    15:Makeord(q);
	    19,22:;
	    23:Makeradical(q);
	    26:Makeover(q);
	    25:Makeunder(q);
	    27:Makemathacce(q);
	    28:Makevcenter(q);
	    {634}14:BEGIN
		curstyle:=mem[q].hh.b1;
		{610}
		BEGIN
		IF curstyle<4 THEN
		    cursize:=0
		ELSE
		    cursize:=16*((curstyle-2)
				 DIV 2);
		curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
		END;
		GOTO 81;
		END;
	    8,12,7:GOTO 81;
	    2:BEGIN
		IF mem[q+3].int>maxh THEN
		    maxh:=mem[q+3].int;
		IF mem[q+2].int>maxd THEN
		    maxd:=mem[q+2].int;
		GOTO 81;
		END;
	    10:BEGIN{635}
		IF mem[q].hh.b1=99 THEN
		    BEGIN
		    x:=mem[q+1].hh.lh;
		    y:=Mathglue(x,curmu);
		    Deletegluere(x);
		    mem[q+1].hh.lh:=y;
		    mem[q].hh.b1:=0;
		    END
		ELSE
		    IF(cursize>0)AND(mem[q].hh.b1=98)THEN
			BEGIN
			p:=mem[q].hh.rh;
			IF p<>0 THEN
			    IF(mem[p].hh.b0=10)OR(mem[p].hh.b0=11)THEN
				BEGIN
				mem[q].hh.
				rh:=mem[p].hh.rh;
				mem[p].hh.rh:=0;
				Flushnodelis(p);
				END;
			END;
		GOTO 81;
		END;
	    11:BEGIN
		Mathkern(q,curmu);
		GOTO 81;
		END;
	    OTHERS:Confusion(644)
	    END;
	{654}
	CASE mem[q+1].hh.rh OF
	    1:{655}BEGIN
		Fetch(q+1);
		IF(curi.b0>0)THEN
		    BEGIN
		    delta:=fontinfo[italicbase[curf]+curi.b2 DIV 4].
		    int;
		    p:=Newcharacter(curf,curc);
		    IF(mem[q+3].hh.rh=0)AND(delta<>0)THEN
			BEGIN
			mem[p].hh.rh:=Newkern(delta)
			;
			delta:=0;
			END;
		    END
		ELSE
		    p:=0;
		END;
	    0:p:=0;
	    2:p:=mem[q+1].hh.lh;
	    3:BEGIN
		curmlist:=mem[q+1].hh.lh;
		savestyle:=curstyle;
		mlistpenalti:=false;
		Mlisttohlist;
		curstyle:=savestyle;
		{610}
		BEGIN
		IF curstyle<4 THEN
		    cursize:=0
		ELSE
		    cursize:=16*((curstyle-2)
				 DIV 2);
		curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
		END;
		p:=Hpack(mem[10003].hh.rh,0,1);
		END;
	    OTHERS:Confusion(645)
	    END;
	mem[q+1].int:=p;
	IF(mem[q+3].hh.rh=0)AND(mem[q+2].hh.rh=0)THEN
	    GOTO 82;
	Makescripts(q,delta);
    82:
	z:=Hpack(mem[q+1].int,0,1);
	IF mem[z+3].int>maxh THEN
	    maxh:=mem[z+3].int;
	IF mem[z+2].int>maxd THEN
	    maxd:=mem[z+2].int;
	Freenode(z,7);
    80:
	r:=q;
	rtype:=mem[r].hh.b0;
    81:
	q:=mem[q].hh.rh;
	END;
    {660}p:=10003;
    mem[p].hh.rh:=0;
    q:=mlist;
    rtype:=0;
    curstyle:=style;
    {610}
    BEGIN
    IF curstyle<4 THEN
	cursize:=0
    ELSE
	cursize:=16*((curstyle-2)
		     DIV 2);
    curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
    END;
    WHILE q<>0 DO
	BEGIN{661}
	t:=22;
	s:=4;
	pen:=10000;
	CASE mem[q].hh.b0 OF
	    15,16,19,20,21:t:=mem[q].hh.b0;
	    17:BEGIN
		t:=17;
		pen:=eqtb[3592].int;
		END;
	    18:BEGIN
		t:=18;
		pen:=eqtb[3593].int;
		END;
	    22,28,26,25:;
	    23:s:=5;
	    27:s:=5;
	    24:s:=6;
	    29,30:t:=Makeleftrigh(q,style,maxd,maxh);
	    14:{663}BEGIN
		curstyle:=mem[q].hh.b1;
		s:=2;
		{610}
		BEGIN
		IF curstyle<4 THEN
		    cursize:=0
		ELSE
		    cursize:=16*((curstyle-2)
				 DIV 2);
		curmu:=Xovern(fontinfo[6+parambase[eqtb[2897+cursize].hh.rh]].int,18);
		END;
		GOTO 83;
		END;
	    8,12,2,7,10,11:BEGIN
		mem[p].hh.rh:=q;
		p:=q;
		q:=mem[q].hh.rh;
		mem[p].hh.rh:=0;
		GOTO 30;
		END;
	    OTHERS:Confusion(646)
	    END;
	{666}
	IF rtype>0 THEN
	    BEGIN
	    CASE strpool[rtype*8+t+magicoffset]OF
		48:x:=0
		    ;
		49:IF curstyle<4 THEN
		       x:=14
		   ELSE
		       x:=0;
		50:x:=14;
		51:IF curstyle<4 THEN
		       x:=15
		   ELSE
		       x:=0;
		52:x:=16;
		OTHERS:Confusion(648)
		END;
	    IF x<>0 THEN
		BEGIN
		y:=Mathglue(eqtb[2362+x].hh.rh,curmu);
		z:=Newglue(y);
		mem[y].hh.rh:=0;
		mem[p].hh.rh:=z;
		p:=z;
		mem[z].hh.b1:=x+1;
		END;
	    END;
	{667}
	IF mem[q+1].int<>0 THEN
	    BEGIN
	    mem[p].hh.rh:=mem[q+1].int;
	    REPEAT
		p:=mem[p].hh.rh;
	    UNTIL mem[p].hh.rh=0;
	    END;
	IF(pen<10000)AND penalties AND(mem[q].hh.rh<>0)THEN
	    BEGIN
	    rtype:=mem[mem
		       [q].hh.rh].hh.b0;
	    IF(rtype<>12)AND(rtype<>18)THEN
		BEGIN
		z:=Newpenalty(pen);
		mem[p].hh.rh:=z;
		p:=z;
		END;
	    END;
	rtype:=t;
    83:
	r:=q;
	q:=mem[q].hh.rh;
	Freenode(r,s);
    30:
	END;
    END;

{672}PROCEDURE Pushalignmen;
    VAR
	p:halfword;
    BEGIN
    p:=getnode(3);
    mem[p].hh.rh:=alignptr;
    mem[p].hh.lh:=curalign;
    mem[p+1].hh.lh:=mem[10008].hh.rh;
    mem[p+1].hh.rh:=curspan;
    mem[p+2].int:=alignstate;
    alignptr:=p;
    END;
PROCEDURE Popalignment;
    VAR
	p:halfword;
    BEGIN
    p:=alignptr;
    alignstate:=mem[p+2].int;
    curspan:=mem[p+1].hh.rh;
    mem[10008].hh.rh:=mem[p+1].hh.lh;
    curalign:=mem[p].hh.lh;
    alignptr:=mem[p].hh.rh;
    freenode(p,3);
    END;
    {674}{681}
PROCEDURE Getpreamblet;
    LABEL
	21;
    BEGIN
    21:
    gettoken;
    IF(curcmd=73)AND(curchr=10)THEN
	BEGIN
	scanoptional;
	scanglue(false);
	eqdefine(2372,98,curval);
	GOTO 21;
	END;
    IF(curchr=128)AND(curcmd=4)THEN
	BEGIN
	printnl(653);
	BEGIN
	helpptr:=2;
	helpline[1]:=654;
	helpline[0]:=655;
	END;
	error;
	GOTO 21;
	END;
    END;
PROCEDURE Alignpeek;
    FORWARD;
PROCEDURE Offsave;
    FORWARD;
PROCEDURE Initalign;
    LABEL
	30,31,32,22;
    VAR
	savecsptr:halfword;
	p:halfword;
    BEGIN
    savecsptr:=csptr;
    Pushalignmen;
    alignstate:=-1000000;
    {676}
    IF(curlist.modefield=185)AND((curlist.tailfield<>curlist.headfield)
				 OR(curlist.auxfield<>0))THEN
	BEGIN
	printnl(649);
	BEGIN
	helpptr:=3;
	helpline[2]:=650;
	helpline[1]:=651;
	helpline[0]:=652;
	END;
	error;
	curstyle:=0;
	mlistpenalti:=false;
	curmlist:=mem[curlist.headfield].hh.rh;
	mlisttohlist;
	flushnodelis(mem[10003].hh.rh);
	curstyle:=0;
	curmlist:=curlist.auxfield;
	mlisttohlist;
	flushnodelis(mem[10003].hh.rh);
	END;
    pushnest;
    {675}
    IF curlist.modefield=185 THEN
	BEGIN
	curlist.modefield:=-1;
	curlist.auxfield:=nest[nestptr-2].auxfield;
	END
    ELSE
	IF curlist.modefield>0 THEN
	    curlist.modefield:=-curlist.
	    modefield;
    scanspec;
    newsavelevel(8);
    {677}mem[10008].hh.rh:=0;
    curalign:=10008;
    scannerstatu:=4;
    warningindex:=savecsptr;
    WHILE true DO
	BEGIN{678}
	mem[curalign].hh.rh:=newparamglue(10);
	curalign:=mem[curalign].hh.rh;
	IF curcmd=5 THEN
	    GOTO 30;
	{679}{682}p:=10004;
	mem[p].hh.rh:=0;
	WHILE true DO
	    BEGIN
	    Getpreamblet;
	    IF curcmd=6 THEN
		GOTO 31;
	    IF(curcmd<=5)AND(curcmd>=4)THEN
		BEGIN
		printnl(656);
		BEGIN
		helpptr:=3;
		helpline[2]:=657;
		helpline[1]:=658;
		helpline[0]:=659;
		END;
		backerror;
		GOTO 31;
		END;
	    IF(curcmd<>10)OR(p<>10004)THEN
		BEGIN
		mem[p].hh.rh:=getavail;
		p:=mem[p].hh.rh;
		mem[p].hh.lh:=curtok;
		END;
	    END;
    31:;
	mem[curalign].hh.rh:=newnullbox;
	curalign:=mem[curalign].hh.rh;
	mem[curalign].hh.lh:=10009;
	mem[curalign+1].int:=-1073741824;
	mem[curalign+3].int:=mem[10004].hh.rh;
	{683}p:=10004;
	mem[p].hh.rh:=0;
	WHILE true DO
	    BEGIN
    22:
	    Getpreamblet;
	    IF(curcmd<=5)AND(curcmd>=4)AND(alignstate=-999999)THEN
		GOTO 32;
	    IF curcmd=6 THEN
		BEGIN
		printnl(660);
		BEGIN
		helpptr:=3;
		helpline[2]:=657;
		helpline[1]:=658;
		helpline[0]:=661;
		END;
		GOTO 22;
		END;
	    mem[p].hh.rh:=getavail;
	    p:=mem[p].hh.rh;
	    mem[p].hh.lh:=curtok;
	    END;
    32:
	mem[p].hh.rh:=getavail;
	p:=mem[p].hh.rh;
	mem[p].hh.lh:=2304;
	mem[curalign+2].int:=mem[10004].hh.rh;
	END;
    30:
    scannerstatu:=0;
    Alignpeek;
    END;
    {685}{686}
PROCEDURE Initspan(p:halfword);
    BEGIN
    pushnest;
    IF curlist.modefield=-1 THEN
	curlist.auxfield:=-65536000
    ELSE
	curlist.
	auxfield:=1000;
    curspan:=p;
    END;
PROCEDURE Initrow;
    BEGIN
    pushnest;
    curlist.modefield:=(-94)-curlist.modefield;
    BEGIN
    mem[curlist.tailfield].hh.rh:=newglue(mem[mem[10008].hh.rh+1].hh.
					  lh);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    mem[curlist.tailfield].hh.b1:=11;
    curalign:=mem[mem[10008].hh.rh].hh.rh;
    Initspan(curalign);
    END;
    {687}
PROCEDURE Initcol;
    BEGIN
    mem[curalign+5].hh.lh:=curcmd;
    IF curcmd=62 THEN
	alignstate:=0
    ELSE
	BEGIN
	backinput;
	begintokenli(mem[curalign+3].int,1);
	alignstate:=1000000;
	END;
    END;
    {690}
FUNCTION Fincol:boolean;
    LABEL
	10;
    VAR
	p:halfword;
	q:halfword;
	s:halfword;
	u:halfword;
	w:scaled;
	o:glueord;
	n:halfword;
    BEGIN
    IF(curalign=0)OR(mem[curalign].hh.rh=0)THEN
	confusion(662);
    p:=mem[mem[curalign].hh.rh].hh.rh;
    {691}
    IF(p=0)AND(mem[curalign+5].hh.lh<>129)THEN
	BEGIN
	printnl(663);
	BEGIN
	helpptr:=3;
	helpline[2]:=664;
	helpline[1]:=665;
	helpline[0]:=666;
	END;
	mem[curalign+5].hh.lh:=129;
	error;
	END;
    IF mem[curalign+5].hh.lh<>128 THEN
	BEGIN{694}
	BEGIN
	IF curlist.modefield=
	-93 THEN
	    BEGIN
	    u:=hpack(mem[curlist.headfield].hh.rh,0,1);
	    w:=mem[u+1].int;
	    END
	ELSE
	    BEGIN
	    u:=vpackage(mem[curlist.headfield].hh.rh,0,1,0);
	    w:=mem[u+3].int;
	    END;
	n:=0;
	IF curspan<>curalign THEN
	    {696}
	    BEGIN
	    q:=curspan;
	    REPEAT
		n:=n+1;
		q:=mem[mem[q].hh.rh].hh.rh;
	    UNTIL q=curalign;
	    IF n>255 THEN
		confusion(667);
	    q:=curspan;
	    WHILE mem[mem[q].hh.lh].hh.rh<n DO q:=mem[q].hh.lh;
	    IF mem[mem[q].hh.lh].hh.rh>n THEN
		BEGIN
		s:=getnode(2);
		mem[s].hh.lh:=mem[q].hh.lh;
		mem[s].hh.rh:=n;
		mem[q].hh.lh:=s;
		mem[s+1].int:=w;
		END
	    ELSE
		IF mem[mem[q].hh.lh+1].int<w THEN
		    mem[mem[q].hh.lh+1].int:=w;
	    END
	ELSE
	    IF w>mem[curalign+1].int THEN
		mem[curalign+1].int:=w;
	mem[u].hh.b0:=13;
	mem[u].hh.b1:=n;
	{570}
	IF totalstretch[3]<>0 THEN
	    o:=3
	ELSE
	    IF totalstretch[2]<>0 THEN
		o:=
		2
	    ELSE
		IF totalstretch[1]<>0 THEN
		    o:=1
		ELSE
		    o:=0;
	mem[u+5].hh.b1:=o;
	mem[u+6].int:=totalstretch[o];
	{576}
	IF totalshrink[3]<>0 THEN
	    o:=3
	ELSE
	    IF totalshrink[2]<>0 THEN
		o:=2
	    ELSE
		IF totalshrink[1]<>0 THEN
		    o:=1
		ELSE
		    o:=0;
	mem[u+5].hh.b0:=o;
	mem[u+4].int:=totalshrink[o];
	popnest;
	mem[curlist.tailfield].hh.rh:=u;
	curlist.tailfield:=u;
	END;
	{692}
	BEGIN
	mem[curlist.tailfield].hh.rh:=newglue(mem[mem[curalign].hh.rh
						  +1].hh.lh);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield].hh.b1:=11;
	IF mem[curalign+5].hh.lh=129 THEN
	    {693}
	    BEGIN
	    curalign:=p;
	    WHILE curalign<>0 DO
		BEGIN
		BEGIN
		mem[curlist.tailfield].hh.rh:=
		newnullbox;
		curlist.tailfield:=mem[curlist.tailfield].hh.rh;
		END;
		mem[curlist.tailfield].hh.b0:=13;
		IF mem[curalign+1].int<0 THEN
		    mem[curalign+1].int:=0;
		{692}
		BEGIN
		mem[curlist.tailfield].hh.rh:=newglue(mem[mem[curalign].hh.rh
							  +1].hh.lh);
		curlist.tailfield:=mem[curlist.tailfield].hh.rh;
		END;
		mem[curlist.tailfield].hh.b1:=11;
		curalign:=mem[mem[curalign].hh.rh].hh.rh;
		END;
	    Fincol:=true;
	    GOTO 10;
	    END;
	Initspan(p);
	END;
    {366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    curalign:=p;
    Initcol;
    Fincol:=false;
    10:
    END;
    {697}
PROCEDURE Finrow;
    VAR
	p:halfword;
    BEGIN
    IF curlist.modefield=-93 THEN
	BEGIN
	p:=hpack(mem[curlist.headfield
		     ].hh.rh,0,1);
	popnest;
	appendtovlis(p);
	END
    ELSE
	BEGIN
	p:=vpackage(mem[curlist.headfield].hh.rh,0,1,1073741823);
	popnest;
	mem[curlist.tailfield].hh.rh:=p;
	curlist.tailfield:=p;
	curlist.auxfield:=1000;
	END;
    mem[p].hh.b0:=13;
    mem[p+6].int:=0;
    Alignpeek;
    END;

{698}PROCEDURE Doassignment;
    FORWARD;
PROCEDURE Resumeafterd;
    FORWARD;
PROCEDURE Buildpage;
    FORWARD;
PROCEDURE Finalign;
    VAR
	p,q,r,s,u:halfword;
	t:scaled;
	n:halfword;
    BEGIN
    IF curgroup<>8 THEN
	confusion(668);
    unsave;
    {699}q:=mem[mem[10008].hh.rh].hh.rh;
    REPEAT
	flushlist(mem[q+3].int);
	flushlist(mem[q+2].int);
	p:=mem[mem[q].hh.rh].hh.rh;
	IF mem[q+1].int=-1073741824 THEN
	    mem[q+1].int:=0;
	IF(p<>0)AND(mem[q].hh.lh<>10009)THEN
	    {700}
	    BEGIN
	    t:=mem[q+1].int+mem[mem[
				    mem[q].hh.rh+1].hh.lh+1].int;
	    r:=mem[q].hh.lh;
	    s:=10009;
	    mem[s].hh.lh:=p;
	    n:=1;
	    REPEAT
		mem[r+1].int:=mem[r+1].int-t;
		u:=mem[r].hh.lh;
		WHILE mem[r].hh.rh>n DO
		    BEGIN
		    s:=mem[s].hh.lh;
		    n:=mem[mem[s].hh.lh].hh.rh+1;
		    END;
		IF mem[r].hh.rh<n THEN
		    BEGIN
		    mem[r].hh.lh:=mem[s].hh.lh;
		    mem[s].hh.lh:=r;
		    mem[r].hh.rh:=mem[r].hh.rh-1;
		    s:=r;
		    END
		ELSE
		    BEGIN
		    IF mem[r+1].int>mem[mem[s].hh.lh+1].int THEN
			mem[mem[s].
			    hh.lh+1].int:=mem[r+1].int;
		    freenode(r,2);
		    END;
		r:=u;
	    UNTIL r=10009;
	    END;
	mem[q].hh.b0:=13;
	mem[q].hh.b1:=0;
	mem[q+3].int:=mem[q+1].int;
	mem[q+2].int:=0;
	mem[q+5].hh.b1:=0;
	mem[q+5].hh.b0:=0;
	mem[q+6].int:=0;
	mem[q+4].int:=0;
	q:=p;
    UNTIL q=0;
    {701}saveptr:=saveptr-2;
    IF curlist.modefield=-1 THEN
	p:=hpack(mem[10008].hh.rh,savestack[saveptr
					    +1].int,savestack[saveptr+0].int)
    ELSE
	p:=vpackage(mem[10008].hh.rh,
		    savestack[saveptr+1].int,savestack[saveptr+0].int,1073741823);
    q:=p+5;
    REPEAT
	q:=mem[q].hh.rh;
	r:=mem[q+1].hh.lh;
	mem[q].hh.b0:=11;
	mem[q].hh.b1:=0;
	IF mem[p+5].hh.b0=0 THEN
	    mem[q+1].int:=mem[r+1].int
	ELSE
	    IF mem[p+5].hh.
	    b0=1 THEN
		IF mem[r].hh.b0<>mem[p+5].hh.b1 THEN
		    mem[q+1].int:=mem[r+1].
		    int
		ELSE
		    mem[q+1].int:=mem[q+1].int+Round(mem[p+6].gr*mem[r+2].int)
	    ELSE
		IF mem[r].hh.b1<>mem[p+5].hh.b1 THEN
		    mem[q+1].int:=mem[r+1].int
		ELSE
		    mem
		    [q+1].int:=mem[q+1].int-Round(mem[p+6].gr*mem[r+3].int);
	deletegluere(r);
	q:=mem[q].hh.rh;
    UNTIL q=0;
    {702}q:=mem[curlist.headfield].hh.rh;
    WHILE q<>0 DO
	BEGIN
	IF mem[q].hh.b0=13 THEN
	    {703}
	    BEGIN
	    IF curlist.
	    modefield=-1 THEN
		BEGIN
		mem[q].hh.b0:=0;
		mem[q+1].int:=mem[p+1].int;
		END
	    ELSE
		BEGIN
		mem[q].hh.b0:=1;
		mem[q+3].int:=mem[p+3].int;
		END;
	    mem[q+5].hh.b1:=mem[p+5].hh.b1;
	    mem[q+5].hh.b0:=mem[p+5].hh.b0;
	    mem[q+6].gr:=mem[p+6].gr;
	    r:=mem[mem[q+5].hh.rh].hh.rh;
	    s:=mem[mem[p+5].hh.rh].hh.rh;
	    REPEAT{704}
		n:=mem[r].hh.b1;
		t:=mem[s+1].int;
		WHILE n>0 DO
		    BEGIN
		    n:=n-1;
		    s:=mem[s].hh.rh;
		    t:=t+mem[s+1].int;
		    s:=mem[s].hh.rh;
		    t:=t+mem[s+1].int;
		    END;
		IF curlist.modefield=-1 THEN
		    {705}
		    BEGIN
		    mem[r+3].int:=mem[q+3].int;
		    mem[r+2].int:=mem[q+2].int;
		    IF t=mem[r+1].int THEN
			BEGIN
			mem[r+5].hh.b0:=0;
			mem[r+5].hh.b1:=0;
			mem[r+6].gr:=0.0;
			END
		    ELSE
			IF t>mem[r+1].int THEN
			    BEGIN
			    mem[r+5].hh.b0:=1;
			    IF mem[r+6].int=0 THEN
				mem[r+6].gr:=0.0
			    ELSE
				mem[r+6].gr:=(t-mem[r+1].
					      int)/mem[r+6].int;
			    END
			ELSE
			    BEGIN
			    mem[r+5].hh.b1:=mem[r+5].hh.b0;
			    mem[r+5].hh.b0:=2;
			    IF mem[r+4].int=0 THEN
				mem[r+6].gr:=0.0
			    ELSE
				mem[r+6].gr:=(mem[r+1].int-
					      t)/mem[r+4].int;
			    END;
		    mem[r+1].int:=t;
		    mem[r].hh.b0:=0;
		    END
		ELSE
		    {706}
		    BEGIN
		    mem[r+1].int:=mem[q+1].int;
		    IF t=mem[r+3].int THEN
			BEGIN
			mem[r+5].hh.b0:=0;
			mem[r+5].hh.b1:=0;
			mem[r+6].gr:=0.0;
			END
		    ELSE
			IF t>mem[r+3].int THEN
			    BEGIN
			    mem[r+5].hh.b0:=1;
			    IF mem[r+6].int=0 THEN
				mem[r+6].gr:=0.0
			    ELSE
				mem[r+6].gr:=(t-mem[r+3].
					      int)/mem[r+6].int;
			    END
			ELSE
			    BEGIN
			    mem[r+5].hh.b1:=mem[r+5].hh.b0;
			    mem[r+5].hh.b0:=2;
			    IF mem[r+4].int=0 THEN
				mem[r+6].gr:=0.0
			    ELSE
				mem[r+6].gr:=(mem[r+3].int-
					      t)/mem[r+4].int;
			    END;
		    mem[r+3].int:=t;
		    mem[r].hh.b0:=1;
		    END;
		mem[r+4].int:=0;
		IF mem[r].hh.b1>0 THEN
		    BEGIN
		    t:=newkern(0);
		    mem[t].hh.rh:=mem[r].hh.rh;
		    mem[r].hh.rh:=t;
		    r:=t;
		    END;
		r:=mem[mem[r].hh.rh].hh.rh;
		s:=mem[mem[s].hh.rh].hh.rh;
	    UNTIL r=0;
	    END;
	q:=mem[q].hh.rh;
	END;
    flushnodelis(p);
    Popalignment;
    {707}t:=curlist.auxfield;
    p:=mem[curlist.headfield].hh.rh;
    q:=curlist.tailfield;
    popnest;
    IF curlist.modefield=185 THEN
	{1091}
	BEGIN
	Doassignment;
	IF curcmd<>3 THEN
	    {1092}
	    BEGIN
	    printnl(891);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=650;
	    helpline[0]:=651;
	    END;
	    backerror;
	    END
	ELSE
	    {1081}
	    BEGIN
	    getnctoken;
	    IF curcmd<>3 THEN
		BEGIN
		printnl(887);
		BEGIN
		helpptr:=2;
		helpline[1]:=888;
		helpline[0]:=889;
		END;
		backerror;
		END;
	    END;
	popnest;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newpenalty(eqtb[3594].int);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newparamglue(3);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield].hh.rh:=p;
	IF p<>0 THEN
	    curlist.tailfield:=q;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newpenalty(eqtb[3595].int);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newparamglue(3);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	curlist.auxfield:=t;
	Resumeafterd;
	END
    ELSE
	BEGIN
	curlist.auxfield:=t;
	mem[curlist.tailfield].hh.rh:=p;
	IF p<>0 THEN
	    curlist.tailfield:=q;
	IF curlist.modefield=1 THEN
	    Buildpage;
	END;
    END;
    {684}
PROCEDURE Alignpeek;
    BEGIN{366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    IF curcmd=34 THEN
	BEGIN
	scanleftbrac;
	newsavelevel(9);
	END
    ELSE
	IF curcmd=2 THEN
	    Finalign
	ELSE
	    BEGIN
	    Initrow;
	    Initcol;
	    END;
    END;
    {710}{721}
FUNCTION Finiteshrink(p:halfword):halfword;
    VAR
	q:halfword;
    BEGIN
    IF noshrinkerro THEN
	BEGIN
	noshrinkerro:=false;
	printnl(669);
	BEGIN
	helpptr:=5;
	helpline[4]:=670;
	helpline[3]:=671;
	helpline[2]:=672;
	helpline[1]:=673;
	helpline[0]:=674;
	END;
	error;
	END;
    q:=newspec(p);
    mem[q].hh.b1:=0;
    deletegluere(p);
    Finiteshrink:=q;
    END;
    {724}
PROCEDURE Trybreak(pi:integer;
		   breaktype:smallnumber);
    LABEL
	10,30,22,60;
    VAR
	r:halfword;
	prevr:halfword;
	oldl:halfword;
	nobreakyet:boolean;
	{725}prevprevr:halfword;
	s:halfword;
	q:halfword;
	v:halfword;
	t:quarterword;
	f:internalfont;
	l:halfword;
	noderstaysac:boolean;
	linewidth:scaled;
	fitclass:0..3;
	b:halfword;
	d:integer;
	artificialba:boolean;
	savelink:halfword;
    BEGIN{726}
    IF Abs(pi)>=10000 THEN
	IF pi>0 THEN
	    GOTO 10
	ELSE
	    pi:=-10000;
    nobreakyet:=true;
    prevr:=10006;
    oldl:=0;
    curactivewid[1]:=activewidth[1];
    curactivewid[2]:=activewidth[2];
    curactivewid[3]:=activewidth[3];
    curactivewid[4]:=activewidth[4];
    curactivewid[5]:=activewidth[5];
    curactivewid[6]:=activewidth[6];
    WHILE true DO
	BEGIN
    22:
	r:=mem[prevr].hh.rh;
	{727}
	IF mem[r].hh.b0=2 THEN
	    BEGIN
	    curactivewid[1]:=curactivewid[1]+mem[r
						 +1].int;
	    curactivewid[2]:=curactivewid[2]+mem[r+2].int;
	    curactivewid[3]:=curactivewid[3]+mem[r+3].int;
	    curactivewid[4]:=curactivewid[4]+mem[r+4].int;
	    curactivewid[5]:=curactivewid[5]+mem[r+5].int;
	    curactivewid[6]:=curactivewid[6]+mem[r+6].int;
	    prevprevr:=prevr;
	    prevr:=r;
	    GOTO 22;
	    END;
	{730}
	BEGIN
	l:=mem[r+1].hh.lh;
	IF l>oldl THEN
	    BEGIN
	    IF(minimumdemer<1073741823)AND((oldl<>easyline)OR(r
							      =10006))THEN
		{731}
		BEGIN
		IF nobreakyet THEN
		    {732}
		    BEGIN
		    nobreakyet:=false;
		    breakwidth[1]:=background[1];
		    breakwidth[2]:=background[2];
		    breakwidth[3]:=background[3];
		    breakwidth[4]:=background[4];
		    breakwidth[5]:=background[5];
		    breakwidth[6]:=background[6];
		    IF(breaktype=0)OR(curp=0)THEN
			BEGIN
			s:=curp;
			WHILE s<>0 DO
			    BEGIN
			    IF(s>10000)THEN
				GOTO 30;
			    CASE mem[s].hh.b0 OF
				10:{733}BEGIN
				    v:=mem[s+1].hh.lh;
				    breakwidth[1]:=breakwidth[1]-mem[v+1].int;
				    breakwidth[2+mem[v].hh.b0]:=breakwidth[2+mem[v].hh.b0]-mem[v+2].int;
				    breakwidth[6]:=breakwidth[6]-mem[v+3].int;
				    END;
				12:;
				9,11:breakwidth[1]:=breakwidth[1]-mem[s+1].int;
				OTHERS:GOTO 30
				END;
			    s:=mem[s].hh.rh;
			    END;
			END
		    ELSE
			{735}
			BEGIN
			t:=mem[curp].hh.b1;
			s:=curp;
			WHILE t>0 DO
			    BEGIN
			    t:=t-1;
			    s:=mem[s].hh.rh;
			    {736}
			    IF(s>10000)THEN
				BEGIN
				f:=mem[s].hh.b0;
				breakwidth[1]:=breakwidth[1]-fontinfo[widthbase[f]+fontinfo[charbase[f]+
											    mem[s].hh.b1].qqqq.b0].int;
				END
			    ELSE
				CASE mem[s].hh.b0 OF
				    6:BEGIN
					f:=mem[s+1].hh.b0;
					breakwidth[1]:=breakwidth[1]-fontinfo[widthbase[f]+fontinfo[charbase[f]+
												    mem[s+1].hh.b1].qqqq.b0].int;
					END;
				    11:breakwidth[1]:=breakwidth[1]-mem[s+1].int;
				    OTHERS:confusion(675)
				    END;
			    END;
			s:=mem[curp+1].hh.rh;
			WHILE s<>0 DO
			    BEGIN{737}
			    IF(s>10000)THEN
				BEGIN
				f:=mem[s].hh.b0;
				breakwidth[1]:=breakwidth[1]+fontinfo[widthbase[f]+fontinfo[charbase[f]+
											    mem[s].hh.b1].qqqq.b0].int;
				END
			    ELSE
				CASE mem[s].hh.b0 OF
				    6:BEGIN
					f:=mem[s+1].hh.b0;
					breakwidth[1]:=breakwidth[1]+fontinfo[widthbase[f]+fontinfo[charbase[f]+
												    mem[s+1].hh.b1].qqqq.b0].int;
					END;
				    11:breakwidth[1]:=breakwidth[1]+mem[s+1].int;
				    OTHERS:confusion(676)
				    END;
			    s:=mem[s].hh.rh;
			    END;
			breakwidth[1]:=breakwidth[1]+discwidth;
			END;
    30:
		    END;
		{738}
		IF mem[prevr].hh.b0=2 THEN
		    BEGIN
		    mem[prevr+1].int:=mem[prevr+1].int
		    -curactivewid[1]+breakwidth[1];
		    mem[prevr+2].int:=mem[prevr+2].int-curactivewid[2]+breakwidth[2];
		    mem[prevr+3].int:=mem[prevr+3].int-curactivewid[3]+breakwidth[3];
		    mem[prevr+4].int:=mem[prevr+4].int-curactivewid[4]+breakwidth[4];
		    mem[prevr+5].int:=mem[prevr+5].int-curactivewid[5]+breakwidth[5];
		    mem[prevr+6].int:=mem[prevr+6].int-curactivewid[6]+breakwidth[6];
		    END
		ELSE
		    IF prevr=10006 THEN
			BEGIN
			activewidth[1]:=breakwidth[1];
			activewidth[2]:=breakwidth[2];
			activewidth[3]:=breakwidth[3];
			activewidth[4]:=breakwidth[4];
			activewidth[5]:=breakwidth[5];
			activewidth[6]:=breakwidth[6];
			END
		    ELSE
			BEGIN
			q:=getnode(7);
			mem[q].hh.rh:=r;
			mem[q].hh.b0:=2;
			mem[q].hh.b1:=0;
			mem[q+1].int:=breakwidth[1]-curactivewid[1];
			mem[q+2].int:=breakwidth[2]-curactivewid[2];
			mem[q+3].int:=breakwidth[3]-curactivewid[3];
			mem[q+4].int:=breakwidth[4]-curactivewid[4];
			mem[q+5].int:=breakwidth[5]-curactivewid[5];
			mem[q+6].int:=breakwidth[6]-curactivewid[6];
			mem[prevr].hh.rh:=q;
			prevprevr:=prevr;
			prevr:=q;
			END;
		minimumdemer:=minimumdemer+Abs(eqtb[3599].int);
		FOR fitclass:=0 TO 3 DO
		    BEGIN
		    IF minimaldemer[fitclass]<=minimumdemer
		    THEN
			{740}
			BEGIN
			q:=getnode(2);
			mem[q].hh.rh:=passive;
			passive:=q;
			mem[q+1].int:=curp;
			mem[q].hh.lh:=bestplace[fitclass];
			q:=getnode(3);
			mem[q+1].hh.rh:=passive;
			mem[q+1].hh.lh:=bestplline[fitclass]+1;
			mem[q].hh.b1:=fitclass;
			mem[q].hh.b0:=breaktype;
			mem[q+2].int:=minimaldemer[fitclass];
			mem[q].hh.rh:=r;
			mem[prevr].hh.rh:=q;
			prevr:=q;
			IF eqtb[3614].int>2 THEN
			    {741}
			    BEGIN
			    printnl(677);
			    printint(passive);
			    print(678);
			    printint(mem[q+1].hh.lh-1);
			    printchar(46);
			    printint(fitclass);
			    IF breaktype=1 THEN
				printchar(45);
			    print(679);
			    printint(mem[q+2].int);
			    print(680);
			    printint(mem[passive].hh.lh);
			    END;
			END;
		    minimaldemer[fitclass]:=1073741823;
		    END;
		minimumdemer:=1073741823;
		{739}
		IF r<>10006 THEN
		    BEGIN
		    q:=getnode(7);
		    mem[q].hh.rh:=r;
		    mem[q].hh.b0:=2;
		    mem[q].hh.b1:=0;
		    mem[q+1].int:=curactivewid[1]-breakwidth[1];
		    mem[q+2].int:=curactivewid[2]-breakwidth[2];
		    mem[q+3].int:=curactivewid[3]-breakwidth[3];
		    mem[q+4].int:=curactivewid[4]-breakwidth[4];
		    mem[q+5].int:=curactivewid[5]-breakwidth[5];
		    mem[q+6].int:=curactivewid[6]-breakwidth[6];
		    mem[prevr].hh.rh:=q;
		    prevprevr:=prevr;
		    prevr:=q;
		    END;
		END;
	    IF r=10006 THEN
		GOTO 10;
	    {745}
	    IF l>easyline THEN
		BEGIN
		linewidth:=secondwidth;
		oldl:=65534;
		END
	    ELSE
		BEGIN
		oldl:=l;
		IF l>lastspeciall THEN
		    linewidth:=secondwidth
		ELSE
		    IF eqtb[2635].hh.rh=0
		    THEN
			linewidth:=firstwidth
		    ELSE
			linewidth:=mem[eqtb[2635].hh.rh+2*l].int
			;
		END;
	    END;
	END;
	{746}
	BEGIN
	artificialba:=false;
	IF curactivewid[1]<linewidth THEN
	    {747}
	    IF(curactivewid[3]<>0)OR(
				     curactivewid[4]<>0)OR(curactivewid[5]<>0)THEN
		BEGIN
		b:=0;
		fitclass:=1;
		END
	    ELSE
		BEGIN
		b:=badness(linewidth-curactivewid[1],curactivewid[2]);
		IF b>12 THEN
		    IF b>99 THEN
			fitclass:=3
		    ELSE
			fitclass:=2
		ELSE
		    fitclass:=1;
		END
	ELSE
	    {748}
	    BEGIN
	    IF curactivewid[1]-linewidth>curactivewid[6]THEN
		b:=
		10001
	    ELSE
		b:=badness(curactivewid[1]-linewidth,curactivewid[6]);
	    IF b>12 THEN
		fitclass:=0
	    ELSE
		fitclass:=1;
	    END;
	IF(b>10000)OR(pi=-10000)THEN
	    {749}
	    BEGIN
	    IF secondpass AND(minimumdemer=
			      1073741823)AND(mem[r].hh.rh=10006)AND(prevr=10006)THEN
		BEGIN
		b:=0;
		artificialba:=true;
		END
	    ELSE
		IF b>threshold THEN
		    GOTO 60;
	    noderstaysac:=false;
	    END
	ELSE
	    BEGIN
	    prevr:=r;
	    IF b>threshold THEN
		GOTO 22;
	    noderstaysac:=true;
	    END;
	{750}{753}
	IF pi>=0 THEN
	    BEGIN
	    d:=(eqtb[3586].int+b+pi);
	    d:=d*d;
	    END
	ELSE
	    BEGIN
	    d:=eqtb[3586].int+b;
	    d:=d*d;
	    IF pi>-10000 THEN
		d:=d-pi*pi;
	    END;
	IF(breaktype=1)AND(mem[r].hh.b0=1)THEN
	    IF curp<>0 THEN
		d:=d+eqtb[3597].
		int
	    ELSE
		d:=d+eqtb[3598].int;
	IF Abs(fitclass-mem[r].hh.b1)>1 THEN
	    d:=d+eqtb[3599].int;
	IF eqtb[3614].int>2 THEN
	    {751}
	    BEGIN
	    IF printhead<>curp THEN
		{752}
		BEGIN
		savelink:=mem[curp].hh.rh;
		mem[curp].hh.rh:=0;
		printnl(226);
		shortdisplay(mem[printhead].hh.rh);
		mem[curp].hh.rh:=savelink;
		printhead:=curp;
		END;
	    printnl(64);
	    IF curp=0 THEN
		printesc(397)
	    ELSE
		IF mem[curp].hh.b0<>10 THEN
		    BEGIN
		    IF
			mem[curp].hh.b0=12 THEN
			printesc(324)
		    ELSE
			IF mem[curp].hh.b0=7 THEN
			    printesc(213)
			ELSE
			    IF mem[curp].hh.b0=11 THEN
				printesc(205)
			    ELSE
				printesc(
					 207);
		    END;
	    print(681);
	    printint(mem[r+1].hh.rh);
	    print(682);
	    IF artificialba THEN
		printchar(42)
	    ELSE
		printint(b);
	    print(683);
	    printint(pi);
	    print(684);
	    printint(d);
	    END;
	d:=d+mem[r+2].int;
	IF d<=minimaldemer[fitclass]THEN
	    BEGIN
	    minimaldemer[fitclass]:=d;
	    bestplace[fitclass]:=mem[r+1].hh.rh;
	    bestplline[fitclass]:=l;
	    IF d<minimumdemer THEN
		minimumdemer:=d;
	    END;
	IF noderstaysac THEN
	    GOTO 22;
    60:{754}
	mem[prevr].hh.rh:=mem[r].hh.rh;
	freenode(r,3);
	IF prevr=10006 THEN
	    {755}
	    BEGIN
	    r:=mem[10006].hh.rh;
	    IF mem[r].hh.b0=2 THEN
		BEGIN
		activewidth[1]:=activewidth[1]+mem[r+1].int
		;
		activewidth[2]:=activewidth[2]+mem[r+2].int;
		activewidth[3]:=activewidth[3]+mem[r+3].int;
		activewidth[4]:=activewidth[4]+mem[r+4].int;
		activewidth[5]:=activewidth[5]+mem[r+5].int;
		activewidth[6]:=activewidth[6]+mem[r+6].int;
		curactivewid[1]:=activewidth[1];
		curactivewid[2]:=activewidth[2];
		curactivewid[3]:=activewidth[3];
		curactivewid[4]:=activewidth[4];
		curactivewid[5]:=activewidth[5];
		curactivewid[6]:=activewidth[6];
		mem[10006].hh.rh:=mem[r].hh.rh;
		freenode(r,7);
		END;
	    END
	ELSE
	    IF mem[prevr].hh.b0=2 THEN
		BEGIN
		r:=mem[prevr].hh.rh;
		IF r=10006 THEN
		    BEGIN
		    curactivewid[1]:=curactivewid[1]-mem[prevr+1].int;
		    curactivewid[2]:=curactivewid[2]-mem[prevr+2].int;
		`   curactivewid[3]:=curactivewid[3]-mem[prevr+3].int;
		    curactivewid[4]:=curactivewid[4]-mem[prevr+4].int;
		    curactivewid[5]:=curactivewid[5]-mem[prevr+5].int;
		    curactivewid[6]:=curactivewid[6]-mem[prevr+6].int;
		    mem[prevprevr].hh.rh:=10006;
		    freenode(prevr,7);
		    prevr:=prevprevr;
		    END
		ELSE
		    IF mem[r].hh.b0=2 THEN
			BEGIN
			curactivewid[1]:=curactivewid[1]+
			mem[r+1].int;
			curactivewid[2]:=curactivewid[2]+mem[r+2].int;
			curactivewid[3]:=curactivewid[3]+mem[r+3].int;
			curactivewid[4]:=curactivewid[4]+mem[r+4].int;
			curactivewid[5]:=curactivewid[5]+mem[r+5].int;
			curactivewid[6]:=curactivewid[6]+mem[r+6].int;
			mem[prevr+1].int:=mem[prevr+1].int+mem[r+1].int;
			mem[prevr+2].int:=mem[prevr+2].int+mem[r+2].int;
			mem[prevr+3].int:=mem[prevr+3].int+mem[r+3].int;
			mem[prevr+4].int:=mem[prevr+4].int+mem[r+4].int;
			mem[prevr+5].int:=mem[prevr+5].int+mem[r+5].int;
			mem[prevr+6].int:=mem[prevr+6].int+mem[r+6].int;
			mem[prevr].hh.rh:=mem[r].hh.rh;
			freenode(r,7);
			END;
		END;
	END;
	END;
    10:
    END;

{771}PROCEDURE Postlinebrea(finalwidowpe:integer);
    LABEL
	30,31;
    VAR
	q,r,s:halfword;
	discbreak:boolean;
	curwidth:scaled;
	curindent:scaled;
	t:quarterword;
	pen:integer;
	curline:halfword;
    BEGIN{772}
    q:=mem[bestbet+1].hh.rh;
    curp:=0;
    REPEAT
	r:=q;
	q:=mem[q].hh.lh;
	mem[r].hh.lh:=curp;
	curp:=r;
    UNTIL q=0;
    curline:=curlist.alreadyfield+1;
    REPEAT{774}{775}
	q:=mem[curp+1].int;
	discbreak:=false;
	IF q<>0 THEN
	    IF mem[q].hh.b0=10 THEN
		BEGIN
		deletegluere(mem[q+1].hh.lh);
		mem[q+1].hh.lh:=eqtb[2369].hh.rh;
		mem[q].hh.b1:=8;
		mem[eqtb[2369].hh.rh].hh.rh:=mem[eqtb[2369].hh.rh].hh.rh+1;
		GOTO 30;
		END
	    ELSE
		BEGIN
		IF mem[q].hh.b0=7 THEN
		    {776}
		    BEGIN
		    t:=mem[q].hh.b1;
		    {777}
		    IF t=0 THEN
			r:=mem[q].hh.rh
		    ELSE
			BEGIN
			r:=q;
			WHILE t>1 DO
			    BEGIN
			    r:=mem[r].hh.rh;
			    t:=t-1;
			    END;
			s:=mem[r].hh.rh;
			IF NOT(s>10000)THEN
			    IF mem[curp].hh.lh<>0 THEN
				IF mem[mem[curp].hh.lh+1]
				.int=s THEN
				    s:=r;
			r:=mem[s].hh.rh;
			mem[s].hh.rh:=0;
			flushnodelis(mem[q].hh.rh);
			mem[q].hh.b1:=0;
			END;
		    IF mem[q+1].hh.rh<>0 THEN
			{778}
			BEGIN
			s:=mem[q+1].hh.rh;
			WHILE mem[s].hh.rh<>0 DO s:=mem[s].hh.rh;
			mem[s].hh.rh:=r;
			r:=mem[q+1].hh.rh;
			mem[q+1].hh.rh:=0;
			END;
		    IF mem[q+1].hh.lh<>0 THEN
			{779}
			BEGIN
			s:=mem[q+1].hh.lh;
			mem[q].hh.rh:=s;
			WHILE mem[s].hh.rh<>0 DO s:=mem[s].hh.rh;
			mem[q+1].hh.lh:=0;
			q:=s;
			END;
		    mem[q].hh.rh:=r;
		    discbreak:=true;
		    END;
		IF(mem[q].hh.b0=9)OR(mem[q].hh.b0=11)THEN
		    mem[q+1].int:=0;
		END
	ELSE
	    BEGIN
	    q:=10003;
	    WHILE mem[q].hh.rh<>0 DO q:=mem[q].hh.rh;
	    END;
	{780}r:=newparamglue(7);
	mem[r].hh.rh:=mem[q].hh.rh;
	mem[q].hh.rh:=r;
	q:=r;
    30:;
	{781}r:=mem[q].hh.rh;
	mem[q].hh.rh:=0;
	q:=mem[10003].hh.rh;
	mem[10003].hh.rh:=r;
	IF eqtb[2368].hh.rh<>0 THEN
	    BEGIN
	    r:=newparamglue(6);
	    mem[r].hh.rh:=q;
	    q:=r;
	    END;
	{782}
	IF curline>lastspeciall THEN
	    BEGIN
	    curwidth:=secondwidth;
	    curindent:=secondindent;
	    END
	ELSE
	    IF eqtb[2635].hh.rh=0 THEN
		BEGIN
		curwidth:=firstwidth;
		curindent:=firstindent;
		END
	    ELSE
		BEGIN
		curwidth:=mem[eqtb[2635].hh.rh+2*curline].int;
		curindent:=mem[eqtb[2635].hh.rh+2*curline-1].int;
		END;
	justbox:=hpack(q,curwidth,0);
	mem[justbox+4].int:=curindent;
	{783}appendtovlis(justbox);
	IF mem[10005].hh.rh<>0 THEN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=mem[
					      10005].hh.rh;
	    REPEAT
		curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    UNTIL mem[curlist.tailfield].hh.rh=0;
	    END;
	{784}
	IF curline+1=bestline THEN
	    pen:=0
	ELSE
	    pen:=eqtb[3596].int;
	IF(curline=curlist.alreadyfield+1)AND(bestline<>curlist.alreadyfield+2)
	THEN
	    pen:=pen+eqtb[3589].int;
	IF curline+2=bestline THEN
	    pen:=pen+finalwidowpe;
	IF discbreak THEN
	    pen:=pen+eqtb[3591].int;
	IF pen<>0 THEN
	    BEGIN
	    r:=newpenalty(pen);
	    mem[curlist.tailfield].hh.rh:=r;
	    curlist.tailfield:=r;
	    END;
	curline:=curline+1;
	curp:=mem[curp].hh.lh;
	IF curp<>0 THEN
	    {773}
	    BEGIN
	    r:=10003;
	    WHILE true DO
		BEGIN
		q:=mem[r].hh.rh;
		IF q=mem[curp+1].int THEN
		    GOTO 31;
		IF(q>10000)THEN
		    GOTO 31;
		IF(mem[q].hh.b0<9)THEN
		    GOTO 31;
		r:=q;
		END;
    31:
	    IF r<>10003 THEN
		BEGIN
		mem[r].hh.rh:=0;
		flushnodelis(mem[10003].hh.rh);
		mem[10003].hh.rh:=q;
		END;
	    END;
    UNTIL curp=0;
    IF(curline<>bestline)OR(mem[10003].hh.rh<>0)THEN
	confusion(689);
    curlist.alreadyfield:=bestline-1;
    END;
    {789}{800}
FUNCTION Reconstitute(j,n:smallnumber):smallnumber;
    LABEL
	22,30;
    VAR
	p:halfword;
	s:halfword;
	q:fourquarters;
	c:quarterword;
	d:quarterword;
	w:scaled;
	r:0..fontmemsize;
    BEGIN{801}
    hyphenpassed:=0;
    s:=10004;
    w:=0;
    d:=hu[j];
    c:=d;
    WHILE true DO
	BEGIN
    22:
	p:=getavail;
	mem[p].hh.b0:=hf;
	mem[p].hh.b1:=c;
	mem[s].hh.rh:=p;
	{802}
	IF j=n THEN
	    GOTO 30;
	q:=fontinfo[charbase[hf]+d].qqqq;
	IF(q.b2 MOD 4)<>1 THEN
	    GOTO 30;
	r:=ligkernbase[hf]+q.b3;
	c:=hu[j+1];
	WHILE true DO
	    BEGIN
	    q:=fontinfo[r].qqqq;
	    IF q.b1=c THEN
		BEGIN
		IF Odd(hyf[j])AND(hyphenpassed=0)THEN
		    hyphenpassed
		    :=j;
		IF q.b2<128 THEN
		    {803}
		    BEGIN
		    d:=q.b3;
		    j:=j+1;
		    s:=p;
		    GOTO 22;
		    END
		ELSE
		    BEGIN
		    w:=fontinfo[kernbase[hf]+q.b3].int;
		    GOTO 30;
		    END;
		END
	    ELSE
		IF q.b0<128 THEN
		    r:=r+1
		ELSE
		    GOTO 30;
	    END;
	END;
    30:;
    {804}
    IF s<>10004 THEN
	BEGIN
	p:=newligature(hf,d,mem[10004].hh.rh);
	mem[10004].hh.rh:=p;
	END;
    {805}
    IF w<>0 THEN
	mem[mem[10004].hh.rh].hh.rh:=newkern(w);
    Reconstitute:=j;
    END;
PROCEDURE Hyphenate;
    LABEL
	30,40,45,41,10;
    VAR
	{795}i,j,l:smallnumber;
	q,r,s:halfword;
	{806}majortail,minortail:halfword;
	{816}z:triepointer;
	v:quarterword;
	{823}h:hyphpointer;
	k:strnumber;
	u:poolpointer;
    BEGIN{817}
    FOR j:=0 TO hn DO hyf[j]:=0;
    {824}h:=hc[1];
    FOR j:=2 TO hn DO h:=(h+h+hc[j])MOD 307;
    WHILE true DO
	BEGIN{825}
	k:=hyphword[h];
	IF k=0 THEN
	    GOTO 45;
	IF(strstart[k+1]-strstart[k])<hn THEN
	    GOTO 45;
	IF(strstart[k+1]-strstart[k])=hn THEN
	    BEGIN
	    j:=1;
	    u:=strstart[k];
	    REPEAT
		IF strpool[u]<hc[j]THEN
		    GOTO 45;
		IF strpool[u]>hc[j]THEN
		    GOTO 30;
		j:=j+1;
		u:=u+1;
	    UNTIL j>hn;
	    {826}s:=hyphlist[h];
	    WHILE s<>0 DO
		BEGIN
		hyf[mem[s].hh.lh]:=1;
		s:=mem[s].hh.rh;
		END;
	    GOTO 40;
	    END;
    30:;
	IF h>0 THEN
	    h:=h-1
	ELSE
	    h:=307;
	END;
    45:;
    hc[0]:=127;
    hc[hn+1]:=127;
    hc[hn+2]:=256;
    FOR j:=0 TO hn-2 DO
	BEGIN
	z:=hc[j];
	l:=j;
	WHILE hc[l]=trie[z].b1 DO
	    BEGIN
	    IF trie[z].b0<>0 THEN
		{818}
		BEGIN
		v:=trie[
			z].b0;
		REPEAT
		    i:=l-hyfdistance[v];
		    IF hyfnum[v]>hyf[i]THEN
			hyf[i]:=hyfnum[v];
		    v:=hyfnext[v];
		UNTIL v=0;
		END;
	    l:=l+1;
	    z:=trie[z].rh+hc[l];
	    END;
	END;
    40:
    hyf[1]:=0;
    hyf[hn-2]:=0;
    hyf[hn-1]:=0;
    hyf[hn]:=0;
    {796}
    FOR j:=2 TO hn-3 DO
	IF Odd(hyf[j])THEN
	    GOTO 41;
    GOTO 10;
    41:;
    {797}q:=mem[hb].hh.rh;
    mem[hb].hh.rh:=0;
    s:=curp;
    WHILE mem[s].hh.rh<>ha DO s:=mem[s].hh.rh;
    mem[s].hh.rh:=0;
    flushnodelis(ha);
    {807}j:=0;
    REPEAT
	l:=j;
	j:=Reconstitute(j+1,hn);
	IF hyphenpassed<>0 THEN
	    {808}
	    BEGIN
	    r:=getnode(2);
	    mem[s].hh.rh:=r;
	    mem[r].hh.rh:=mem[10004].hh.rh;
	    mem[r].hh.b0:=7;
	    majortail:=mem[10004].hh.rh;
	    IF mem[majortail].hh.rh<>0 THEN
		majortail:=mem[majortail].hh.rh;
	    i:=hyphenpassed;
	    {809}minortail:=0;
	    c:=hu[i+1];
	    hu[i+1]:=45;
	    REPEAT
		l:=Reconstitute(l+1,i+1);
		IF minortail=0 THEN
		    mem[r+1].hh.lh:=mem[10004].hh.rh
		ELSE
		    mem[minortail]
		    .hh.rh:=mem[10004].hh.rh;
		minortail:=mem[10004].hh.rh;
		IF mem[minortail].hh.rh<>0 THEN
		    minortail:=mem[minortail].hh.rh;
	    UNTIL l>i;
	    hu[i+1]:=c;
	    l:=l-1;
	    hyf[l]:=0;
	    {810}minortail:=0;
	    mem[r+1].hh.rh:=0;
	    WHILE l<j DO
		BEGIN
		REPEAT
		    l:=Reconstitute(l+1,hn);
		    IF minortail=0 THEN
			mem[r+1].hh.rh:=mem[10004].hh.rh
		    ELSE
			mem[minortail]
			.hh.rh:=mem[10004].hh.rh;
		    minortail:=mem[10004].hh.rh;
		    IF mem[minortail].hh.rh<>0 THEN
			BEGIN
			hyf[l]:=0;
			minortail:=mem[minortail].hh.rh;
			END;
		UNTIL l>=j;
		WHILE l>j DO
		    BEGIN
		    j:=Reconstitute(j+1,hn);
		    mem[majortail].hh.rh:=mem[10004].hh.rh;
		    majortail:=mem[10004].hh.rh;
		    IF mem[majortail].hh.rh<>0 THEN
			BEGIN
			hyf[j]:=0;
			majortail:=mem[majortail].hh.rh;
			END;
		    END;
		END;
	    {811}i:=0;
	    s:=r;
	    WHILE mem[s].hh.rh<>0 DO
		BEGIN
		i:=i+1;
		s:=mem[s].hh.rh;
		END;
	    mem[r].hh.b1:=i;
	    END
	ELSE
	    BEGIN
	    mem[s].hh.rh:=mem[10004].hh.rh;
	    s:=mem[s].hh.rh;
	    IF mem[s].hh.rh<>0 THEN
		s:=mem[s].hh.rh;
	    END;
	IF Odd(hyf[j])THEN
	    {812}
	    BEGIN
	    r:=newdisc;
	    mem[r+1].hh.lh:=newcharacter(hf,45);
	    mem[s].hh.rh:=r;
	    s:=r;
	    END;
    UNTIL j=hn;
    mem[s].hh.rh:=q;
    10:
    END;

PROCEDURE Linebreak(finalwidowpe:integer);
    LABEL
	30,31,32,33,34;
    VAR
	{756}autobreaking:boolean;
	prevp:halfword;
	q,r,s:halfword;
	f:internalfont;
	{787}i,j,l:smallnumber;
	c:0..255;
    BEGIN
    parbeginline:=curlist.mlfield;
    {711}mem[10003].hh.rh:=mem[curlist.headfield].hh.rh;
    IF(curlist.tailfield>10000)THEN
	BEGIN
	mem[curlist.tailfield].hh.rh:=
	newpenalty(10000);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END
    ELSE
	IF(mem[curlist.tailfield].hh.b0<>10)OR(mem[curlist.tailfield].
					       hh.b1>=100)THEN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newpenalty(10000);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END
	ELSE
	    BEGIN
	    mem[curlist.tailfield].hh.b0:=12;
	    deletegluere(mem[curlist.tailfield+1].hh.lh);
	    mem[curlist.tailfield+1].int:=10000;
	    END;
    mem[curlist.tailfield].hh.rh:=newparamglue(13);
    popnest;
    {722}noshrinkerro:=true;
    IF(mem[eqtb[2368].hh.rh].hh.b1<>0)AND(mem[eqtb[2368].hh.rh+3].int<>0)
    THEN
	BEGIN
	eqtb[2368].hh.rh:=Finiteshrink(eqtb[2368].hh.rh);
	END;
    IF(mem[eqtb[2369].hh.rh].hh.b1<>0)AND(mem[eqtb[2369].hh.rh+3].int<>0)
    THEN
	BEGIN
	eqtb[2369].hh.rh:=Finiteshrink(eqtb[2369].hh.rh);
	END;
    q:=eqtb[2368].hh.rh;
    r:=eqtb[2369].hh.rh;
    background[1]:=mem[q+1].int+mem[r+1].int;
    background[2]:=0;
    background[3]:=0;
    background[4]:=0;
    background[5]:=0;
    background[2+mem[q].hh.b0]:=mem[q+2].int;
    background[2+mem[r].hh.b0]:=background[2+mem[r].hh.b0]+mem[r+2].int;
    background[6]:=mem[q+3].int+mem[r+3].int;
    {729}minimumdemer:=1073741823;
    minimaldemer[0]:=1073741823;
    minimaldemer[1]:=1073741823;
    minimaldemer[2]:=1073741823;
    minimaldemer[3]:=1073741823;
    {743}
    IF eqtb[2635].hh.rh=0 THEN
	IF eqtb[4023].int=0 THEN
	    BEGIN
	    lastspeciall:=0;
	    firstwidth:=eqtb[4010].int;
	    secondwidth:=firstwidth;
	    END
	ELSE
	    {744}
	    BEGIN
	    lastspeciall:=Abs(eqtb[3621].int);
	    IF eqtb[3621].int<0 THEN
		BEGIN
		firstwidth:=eqtb[4010].int-Abs(eqtb[4023]
					       .int);
		IF eqtb[4023].int>=0 THEN
		    firstindent:=eqtb[4023].int
		ELSE
		    firstindent:=
		    0;
		secondwidth:=eqtb[4010].int;
		secondindent:=0;
		END
	    ELSE
		BEGIN
		firstwidth:=eqtb[4010].int;
		firstindent:=0;
		secondwidth:=eqtb[4010].int-Abs(eqtb[4023].int);
		IF eqtb[4023].int>=0 THEN
		    secondindent:=eqtb[4023].int
		ELSE
		    secondindent
		    :=0;
		END;
	    END
    ELSE
	BEGIN
	lastspeciall:=mem[eqtb[2635].hh.rh].hh.lh-1;
	secondwidth:=mem[eqtb[2635].hh.rh+2*(lastspeciall+1)].int;
	secondindent:=mem[eqtb[2635].hh.rh+2*lastspeciall+1].int;
	END;
    IF eqtb[3602].int=0 THEN
	easyline:=lastspeciall
    ELSE
	easyline:=65535;
    {757}
    IF eqtb[3614].int>2 THEN
	BEGIN
	begindiagnos;
	printnl(685);
	END;
    threshold:=eqtb[3584].int;
    secondpass:=false;
    WHILE true DO
	BEGIN{758}
	q:=getnode(3);
	mem[q].hh.b0:=0;
	mem[q].hh.b1:=1;
	mem[q].hh.rh:=10006;
	mem[q+1].hh.rh:=0;
	mem[q+1].hh.lh:=curlist.alreadyfield+1;
	mem[q+2].int:=0;
	mem[10006].hh.rh:=q;
	activewidth[1]:=background[1];
	activewidth[2]:=background[2];
	activewidth[3]:=background[3];
	activewidth[4]:=background[4];
	activewidth[5]:=background[5];
	activewidth[6]:=background[6];
	passive:=0;
	printhead:=10003;
	fontinshortd:=0;
	curp:=mem[10003].hh.rh;
	autobreaking:=true;
	prevp:=curp;
	WHILE(curp<>0)AND(mem[10006].hh.rh<>10006)DO{760}
	    BEGIN
	    IF(curp>10000)
	    THEN
		{761}
		BEGIN
		prevp:=curp;
		REPEAT
		    f:=mem[curp].hh.b0;
		    activewidth[1]:=activewidth[1]+fontinfo[widthbase[f]+fontinfo[charbase[f
											   ]+mem[curp].hh.b1].qqqq.b0].int;
		    curp:=mem[curp].hh.rh;
		UNTIL NOT(curp>10000);
		END;
	    CASE mem[curp].hh.b0 OF
		0,1,2:activewidth[1]:=activewidth[1]+mem[curp+1]
		    .int;
		8:{1240};
		10:BEGIN{762}
		    IF autobreaking THEN
			BEGIN
			IF(prevp>10000)THEN
			    Trybreak(0,0
				     )
			ELSE
			    IF(mem[prevp].hh.b0<=9)THEN
				Trybreak(0,0);
			END;
		    {763}
		    BEGIN
		    IF(mem[mem[curp+1].hh.lh].hh.b1<>0)AND(mem[mem[curp+1].hh.lh
							       +3].int<>0)THEN
			BEGIN
			mem[curp+1].hh.lh:=Finiteshrink(mem[curp+1].hh.lh)
			;
			END;
		    q:=mem[curp+1].hh.lh;
		    activewidth[1]:=activewidth[1]+mem[q+1].int;
		    activewidth[2+mem[q].hh.b0]:=activewidth[2+mem[q].hh.b0]+mem[q+2].int;
		    activewidth[6]:=activewidth[6]+mem[q+3].int;
		    END;
		    IF secondpass AND autobreaking THEN
			{788}
			BEGIN
			s:=mem[curp].hh.rh;
			IF s<>0 THEN
			    BEGIN{790}
			    WHILE true DO
				BEGIN
				IF(s>10000)THEN
				    BEGIN
				    c:=mem[
					   s].hh.b1;
				    hf:=mem[s].hh.b0;
				    END
				ELSE
				    IF mem[s].hh.b0=6 THEN
					BEGIN
					q:=mem[s+1].hh.rh;
					c:=mem[q].hh.b1;
					hf:=mem[q].hh.b0;
					END
				    ELSE
					IF mem[s].hh.b0<>11 THEN
					    GOTO 31
					ELSE
					    c:=128;
				IF c<128 THEN
				    IF eqtb[3200+c].hh.rh<>0 THEN
					IF(eqtb[3200+c].hh.rh=c)OR(
								   eqtb[3618].int<>0)THEN
					    GOTO 32
					ELSE
					    GOTO 31;
				s:=mem[s].hh.rh;
				END;
    32:
			    ha:=s;
			    {791}hn:=0;
			    WHILE true DO
				BEGIN
				IF(s>10000)THEN
				    BEGIN
				    IF mem[s].hh.b0<>hf THEN
					GOTO
					33;
				    c:=mem[s].hh.b1;
				    IF c>=128 THEN
					GOTO 33;
				    IF(eqtb[3200+c].hh.rh=0)OR(hn=63)THEN
					GOTO 33;
				    hb:=s;
				    hn:=hn+1;
				    hu[hn]:=c;
				    hc[hn]:=eqtb[3200+c].hh.rh;
				    END
				ELSE
				    IF mem[s].hh.b0=6 THEN
					{792}
					BEGIN
					j:=hn;
					q:=mem[s+1].hh.rh;
					IF mem[q].hh.b0<>hf THEN
					    GOTO 33;
					REPEAT
					    c:=mem[q].hh.b1;
					    IF c>=128 THEN
						GOTO 33;
					    IF(eqtb[3200+c].hh.rh=0)OR(j=63)THEN
						GOTO 33;
					    j:=j+1;
					    hu[j]:=c;
					    hc[j]:=eqtb[3200+c].hh.rh;
					    q:=mem[q].hh.rh;
					UNTIL q=0;
					hb:=s;
					hn:=j;
					END
				    ELSE
					IF mem[s].hh.b0<>11 THEN
					    GOTO 33;
				s:=mem[s].hh.rh;
				END;
    33:;
			    {793}
			    IF hn<5 THEN
				GOTO 31;
			    WHILE true DO
				BEGIN
				IF NOT((s>10000))THEN
				    CASE mem[s].hh.b0 OF
					6,11:;
					10,12,3,5,4:GOTO 34;
					OTHERS:GOTO 31
					END;
				s:=mem[s].hh.rh;
				END;
    34:;
			    Hyphenate;
			    END;
    31:
			END;
		    END;
		11:BEGIN
		    IF NOT(mem[curp].hh.rh>10000)AND autobreaking THEN
			IF mem[mem[
				   curp].hh.rh].hh.b0=10 THEN
			    Trybreak(0,0);
		    activewidth[1]:=activewidth[1]+mem[curp+1].int;
		    END;
		6:BEGIN
		    f:=mem[curp+1].hh.b0;
		    activewidth[1]:=activewidth[1]+fontinfo[widthbase[f]+fontinfo[charbase[f
											   ]+mem[curp+1].hh.b1].qqqq.b0].int;
		    END;
		7:{764}BEGIN
		    s:=mem[curp+1].hh.lh;
		    IF s=0 THEN
			Trybreak(eqtb[3588].int,1)
		    ELSE
			BEGIN
			discwidth:=0;
			REPEAT{765}
			    IF(s>10000)THEN
				BEGIN
				f:=mem[s].hh.b0;
				discwidth:=discwidth+fontinfo[widthbase[f]+fontinfo[charbase[f]+mem[s].
										    hh.b1].qqqq.b0].int;
				END
			    ELSE
				CASE mem[s].hh.b0 OF
				    6:BEGIN
					f:=mem[s+1].hh.b0;
					discwidth:=discwidth+fontinfo[widthbase[f]+fontinfo[charbase[f]+mem[s+1]
											    .hh.b1].qqqq.b0].int;
					END;
				    11:discwidth:=discwidth+mem[s+1].int;
				    OTHERS:confusion(688)
				    END;
			    s:=mem[s].hh.rh;
			UNTIL s=0;
			activewidth[1]:=activewidth[1]+discwidth;
			Trybreak(eqtb[3587].int,1);
			activewidth[1]:=activewidth[1]-discwidth;
			END;
		    END;
		9:BEGIN
		    autobreaking:=(mem[curp].hh.b1=1);
		    BEGIN
		    IF NOT(mem[curp].hh.rh>10000)AND autobreaking THEN
			IF mem[mem[curp
				   ].hh.rh].hh.b0=10 THEN
			    Trybreak(0,0);
		    activewidth[1]:=activewidth[1]+mem[curp+1].int;
		    END;
		    END;
		12:Trybreak(mem[curp+1].int,0);
		4,3,5:;
		OTHERS:confusion(687)
		END;
	    prevp:=curp;
	    curp:=mem[curp].hh.rh;
	    END;
	IF curp=0 THEN
	    {767}
	    BEGIN
	    Trybreak(-10000,1);
	    IF mem[10006].hh.rh<>10006 THEN
		BEGIN{768}
		r:=mem[10006].hh.rh;
		fewestdemeri:=1073741823;
		REPEAT
		    IF mem[r].hh.b0<>2 THEN
			IF mem[r+2].int<fewestdemeri THEN
			    BEGIN
			    fewestdemeri:=mem[r+2].int;
			    bestbet:=r;
			    END;
		    r:=mem[r].hh.rh;
		UNTIL r=10006;
		bestline:=mem[bestbet+1].hh.lh;
		IF eqtb[3602].int=0 THEN
		    GOTO 30;
		{769}
		BEGIN
		r:=mem[10006].hh.rh;
		actualloosen:=0;
		REPEAT
		    IF mem[r].hh.b0<>2 THEN
			BEGIN
			linediff:=mem[r+1].hh.lh-bestline;
			IF((linediff<actualloosen)AND(eqtb[3602].int<=linediff))OR((linediff>
										    actualloosen)AND(eqtb[3602].int>=linediff))THEN
			    BEGIN
			    bestbet:=r;
			    actualloosen:=linediff;
			    fewestdemeri:=mem[r+2].int;
			    END
			ELSE
			    IF(linediff=actualloosen)AND(mem[r+2].int<fewestdemeri)THEN
				BEGIN
				bestbet:=r;
				fewestdemeri:=mem[r+2].int;
				END;
			END;
		    r:=mem[r].hh.rh;
		UNTIL r=10006;
		bestline:=mem[bestbet+1].hh.lh;
		END;
		IF(actualloosen=eqtb[3602].int)OR secondpass THEN
		    GOTO 30;
		END;
	    END;
	{759}q:=mem[10006].hh.rh;
	WHILE q<>10006 DO
	    BEGIN
	    curp:=mem[q].hh.rh;
	    IF mem[q].hh.b0=2 THEN
		freenode(q,7)
	    ELSE
		freenode(q,3);
	    q:=curp;
	    END;
	q:=passive;
	WHILE q<>0 DO
	    BEGIN
	    curp:=mem[q].hh.rh;
	    freenode(q,2);
	    q:=curp;
	    END;
	IF eqtb[3614].int>2 THEN
	    printnl(686);
	threshold:=eqtb[3585].int;
	secondpass:=true;
	END;
    30:
    IF eqtb[3614].int>2 THEN
	enddiagnosti(true);
    ;
    {770}Postlinebrea(finalwidowpe);
    {759}q:=mem[10006].hh.rh;
    WHILE q<>10006 DO
	BEGIN
	curp:=mem[q].hh.rh;
	IF mem[q].hh.b0=2 THEN
	    freenode(q,7)
	ELSE
	    freenode(q,3);
	q:=curp;
	END;
    q:=passive;
    WHILE q<>0 DO
	BEGIN
	curp:=mem[q].hh.rh;
	freenode(q,2);
	q:=curp;
	END;
    parbeginline:=0;
    END;

{827}PROCEDURE Newhyphexcep;
    LABEL
	10,40,45;
    VAR
	n:smallnumber;
	j:smallnumber;
	h:hyphpointer;
	k:strnumber;
	p:halfword;
	q:halfword;
	s,t:strnumber;
	u,v:poolpointer;
    BEGIN
    scanleftbrac;
    {828}n:=0;
    p:=0;
    WHILE true DO
	BEGIN
	getnctoken;
	CASE curcmd OF
	    11,12:{830}IF curchr=45 THEN
			   {831}
			   BEGIN
			   IF n>1 THEN
			       BEGIN
			       q:=getavail;
			       mem[q].hh.rh:=p;
			       mem[q].hh.lh:=n;
			       p:=q;
			       END;
			   END
		       ELSE
			   BEGIN
			   IF eqtb[3200+curchr].hh.rh=0 THEN
			       BEGIN
			       printnl(693);
			       BEGIN
			       helpptr:=2;
			       helpline[1]:=694;
			       helpline[0]:=695;
			       END;
			       error;
			       END
			   ELSE
			       IF n<63 THEN
				   BEGIN
				   n:=n+1;
				   hc[n]:=eqtb[3200+curchr].hh.rh;
				   END;
			   END;
	    10,2:BEGIN
		IF n>4 THEN
		    {832}
		    BEGIN
		    BEGIN
		    IF poolptr+n>poolsize THEN
			overflow(129,poolsize);
		    END;
		    h:=0;
		    FOR j:=1 TO n DO
			BEGIN
			h:=(h+h+hc[j])MOD 307;
			BEGIN
			strpool[poolptr]:=hc[j];
			poolptr:=poolptr+1;
			END;
			END;
		    s:=makestring;
		    WHILE mem[p].hh.lh>n-3 DO
			BEGIN
			q:=mem[p].hh.rh;
			BEGIN
			mem[p].hh.rh:=avail;
			avail:=p;
			dynused:=dynused-1;
			END;
			p:=q;
			END;
		    {833}
		    IF hyphcount=307 THEN
			overflow(696,307);
		    hyphcount:=hyphcount+1;
		    WHILE hyphword[h]<>0 DO
			BEGIN{834}
			k:=hyphword[h];
			IF(strstart[k+1]-strstart[k])<(strstart[s+1]-strstart[s])THEN
			    GOTO 40;
			IF(strstart[k+1]-strstart[k])>(strstart[s+1]-strstart[s])THEN
			    GOTO 45;
			u:=strstart[k];
			v:=strstart[s];
			REPEAT
			    IF strpool[u]<strpool[v]THEN
				GOTO 40;
			    IF strpool[u]>strpool[v]THEN
				GOTO 45;
			    u:=u+1;
			    v:=v+1;
			UNTIL u=strstart[k+1];
    40:
			q:=hyphlist[h];
			hyphlist[h]:=p;
			p:=q;
			t:=hyphword[h];
			hyphword[h]:=s;
			s:=t;
    45:;
			IF h>0 THEN
			    h:=h-1
			ELSE
			    h:=307;
			END;
		    hyphword[h]:=s;
		    hyphlist[h]:=p;
		    END;
		IF curcmd=2 THEN
		    BEGIN{369}
		    BEGIN
		    getnctoken;
		    IF curcmd<>10 THEN
			backinput;
		    END;
		    GOTO 10;
		    END;
		n:=0;
		p:=0;
		END;
	    OTHERS:{829}BEGIN
		printnl(690);
		BEGIN
		helpptr:=2;
		helpline[1]:=691;
		helpline[0]:=692;
		END;
		error;
		END
	    END;
	END;
    10:
    END;
    {835}{837}
FUNCTION Newtrieop(d,n:smallnumber;
		   v:quarterword):quarterword;
    LABEL
	10;
    VAR
	h:0..510;
	u:quarterword;
    BEGIN
    h:=(n+313*d+361*v)MOD 510;
    WHILE true DO
	BEGIN
	u:=trieophash[h];
	IF u=0 THEN
	    BEGIN
	    IF trieopptr>=254 THEN
		BEGIN
		trieopptr:=255;
		Newtrieop:=0;
		GOTO 10;
		END;
	    trieopptr:=trieopptr+1;
	    hyfdistance[trieopptr]:=d;
	    hyfnum[trieopptr]:=n;
	    hyfnext[trieopptr]:=v;
	    trieophash[h]:=trieopptr;
	    Newtrieop:=trieopptr;
	    GOTO 10;
	    END;
	IF(hyfdistance[u]=d)AND(hyfnum[u]=n)AND(hyfnext[u]=v)THEN
	    BEGIN
	    Newtrieop:=u;
	    GOTO 10;
	    END;
	IF h>0 THEN
	    h:=h-1
	ELSE
	    h:=255;
	END;
    10:
    END;
    {840}
FUNCTION Trienode(p:triepointer):triepointer;
    LABEL
	10;
    VAR
	h:triepointer;
	q:triepointer;
    BEGIN
    h:=(triec[p]+1009*trieo[p]+2718*triel[p]+3142*trier[p])MOD
    triesize;
    WHILE true DO
	BEGIN
	q:=triehash[h];
	IF q=0 THEN
	    BEGIN
	    triehash[h]:=p;
	    Trienode:=p;
	    GOTO 10;
	    END;
	IF(triec[q]=triec[p])AND(trieo[q]=trieo[p])AND(triel[q]=triel[p])AND(
									     trier[q]=trier[p])THEN
	    BEGIN
	    Trienode:=q;
	    GOTO 10;
	    END;
	IF h>0 THEN
	    h:=h-1
	ELSE
	    h:=triesize;
	END;
    10:
    END;
    {841}
FUNCTION Compresstrie(p:triepointer):triepointer;
    BEGIN
    IF p=0 THEN
	Compresstrie:=0
    ELSE
	BEGIN
	triel[p]:=Compresstrie(
			       triel[p]);
	trier[p]:=Compresstrie(trier[p]);
	Compresstrie:=Trienode(p);
	END;
    END;
    {842}
PROCEDURE Initpatternm;
    VAR
	h:0..510;
	p:triepointer;
    BEGIN
    FOR h:=0 TO 510 DO trieophash[h]:=0;
    trieopptr:=0;
    triel[0]:=0;
    triec[0]:=0;
    trieptr:=0;
    FOR p:=0 TO triesize DO triehash[p]:=0;
    END;
    {844}
PROCEDURE Inittriememo;
    VAR
	p:triepointer;
    BEGIN
    FOR p:=0 TO trieptr DO triehash[p]:=0;
    triemax:=128;
    triemin:=128;
    trie[0].rh:=1;
    trietaken[0]:=false;
    FOR p:=1 TO 128 DO
	BEGIN
	trie[p].lh:=p-1;
	trie[p].rh:=p+1;
	trietaken[p]:=false;
	END;
    END;
    {846}
PROCEDURE Firstfit(p:triepointer);
    LABEL
	45,40;
    VAR
	h:triepointer;
	z:triepointer;
	q:triepointer;
	c:asciicode;
    BEGIN
    c:=triec[p];
    IF c<triemin THEN
	triemin:=c;
    z:=trie[triemin-1].rh;
    WHILE true DO
	BEGIN
	IF z<c THEN
	    GOTO 45;
	h:=z-c;
	{847}
	IF triemax<h+128 THEN
	    BEGIN
	    IF triesize<=h+0X∪AαR",p4($N{[↔K6c?]!3I]04PH$%β'∪'↔OOS∃%lhP%↓↓ααJ⊗B,
P4(HKSK'.kπaio#K'↔na-EXh($''∪'↔S∞[↔:o'∪'↔7∂Buiw63O∃Xh($''∪'⊗o'∪'↔7∂Bu;KCQwSKN+7πa[	l4(HKSK'-[SK'.kπbuvc!iw'∪'↔7∂A5ElhP%↓↓ααV:RLaβSKN+7πanA-EICX4(%α↓↓α⊗t!l4(LJ→βS⊗K↔Sπ↑+:o"m""⊗8hP%↓↓αα≡>Rz↓QUlhP'ma#C{Eio#K'↔∃[BulhP&↑"Lb∃βEs↓α∩<hP%↓↓αα
⊗≡Lp4(%α↓↓α&2βSK'-[!/S⊗K↔∞o
ju;KCiAαRD*84(HJ≡>Rz↓QUlhP%↓↓αβEiw'∪'↔J←
ul4PI↓↓↓∧*:⊃lhP&≡>$y↓QAXh)↓↓α↓QUhhP'iio#K'⊗←Ru;KCX4(&,r⊃l4R↓↓↓↓#↓kma#Kx4)α↓↓βS⊗K↔Sπ↑+:o"kQwSK.)l4)α↓↓βS⊗K↔#π≡BoBuSk!l4R↓↓↓βQwAlhQ↓↓↓¬∩⊗B⊗
 4('SQw!/'∪'↔∞←
ul4PKSK'-[SK'-[ju;⊗Bu;3CQwSKN*ojuvc!l4PKSK'-[SK'-[ju;fBu;KCQwSKN*ojuw∪!l4PKSK'-[ju;⊗AiuAXh('ESkSK'/∩oFuXh)↓↓ααV:RLaβEuβX4)↓α↓α⊗:#X4)↓α↓βma+βx4*¬∩>∞⊗%*J∃α'∪'↔C∞≠-#AW#K'↔ε{';S/⊃%l4R↓↓↓α4
H4(O	kSKN+C?'w#↔IlhQ↓↓↓∧∩⊗≡&ph)↓↓ααJ⊗B,
P4(O	iwS⊗K↔2o¬il4(LJ→#Es↓&ε:"CSK'.CπO"←
uuAM""⊗8hP%↓↓αα
⊗≡Lp4(%α↓↓α≠O∪OS≠O!#E%Xh(%↓α↓αSKN+Cπ∂ZCE%lhP%↓↓αα⊗:⊃Xh('ASkSK'/∩oBuXh)↓↓ααV:RLaβAuβX4)↓α↓α⊗:#X4)↓α↓βma+∪x4*¬∩>∞⊗%*J∃α'∪'↔≠OA#Ak'∪'↔C}K;S↔∩Il4)α↓↓αZ
⊂4('SSK'/β?';&+Il4PK
kπ≡≠''∂}#∃l4PKikS⊗K↔C?NsS↔IXh)↓↓αα
⊗≡Lp4)↓α↓βiio#K'↔FO"o¬il4)α↓↓α↑DJ2∃ββayAα$x4(&∀*≡&8hP'Eio#K'↔e[BulhP'
io#K'↔≥[BulhP'SKN*oi/≥i;K!SkSK'.CπO"←
ul4PKSK'-[i/∞js	Ein→l4(O#K'⊗←Q/∞uv⊃Aiw'∪'↔>←αul4PJ&→βqAαRD*84(J↓↓↓α'∪'↔≠OA#E%Xh('ASkSK'/∩oBuXh(&⊗t!l4)α↓↓α⊗t!l4)α↓↓βmC)Ox4UαJ>∞,"VJ∃∧s↔←C∂#S↔Kw→l4)α↓↓α2∩⊗04PIMA1≠	l4)α↓↓αZ
⊂4('Zc1kOn33;.k↔IXh('∪N;'SO.sO↔⊃V∪??3.9l4PKYkG.KS↔↔;?K⊃Xh('Ag	kSKN+C?'w#↔IlhP'≠'↔≠S∂#Nc⊃k}{3↔πsX4('≠SπO∂NK∂?∪+X4('∩cMkS⊗K↔C?NsS↔IXh('!W#←?#∞c[↔MXh)↓↓αα
⊗≡Lp4)↓α↓βO∂∞s3↔≠&∪Kπ
Xh)↓↓αα';''βπSS/∪;5lhQ↓↓↓πYaUSvYiuAXh)↓↓αβ#g~[αuiuβX4)↓α↓β∪'>KSO↔w≠↔⊃in3π3O+X4)↓α↓α↑"Lb∃βS↔+∃α∩xh(&
,:&84PK∨↔Sv≠S?/.ql4(L~εN∃ε≠WK∂n!α>_hP%↓↓α↓EE1⊃kma++z&→ε#'∨''≠↔;O.!α>IF≠WK∂G⊃qQaLzI#∂/∪∂#Is)]&RD*84(HH%↓↓∧∩⊗≡&ph($$J↓↓α&2β∂WK≡CIuQ2αR"⊗ph($$J↓↓↓↓α↓β∂W⊗≠#Iik	I\4PH$%↓αα⊗2N(h($$J↓↓↓↓α↓α
⊗<J84(HH%↓↓α↓↓↓β∨+K∂#∪Qw↔G&∩mMIβ↓/∂W⊗≠#JthP$$%α↓↓↓↓α↓;#!w∪!l4PH$%↓α↓↓↓↓∧J→β∂/∪∂#Ik↓αR",p4($HH%↓↓∧∩⊗≡&ph($$HI↓↓βπ∪';Sva!]AαIl4(HH$%↓αα
⊗≡Lp4($HH%↓↓εC↔3Cπ#IiuX4($HH%↓↓εC↔3CfK;⊗m¬iiuYKIl4(HH$%↓αα⊗:⊃Xh($$HI↓↓β/∪K?IXh($$HI↓↓β∨+K∂#∪QuEI;X4($HH%↓↓∧*:⊃lhP$$%α↓↓↓↓αα⊗:⊃Xh($$J↓↓α&2β-qY~αR"⊗ph($$J↓↓↓↓α↓α
⊗<J84(HH%↓↓α↓↓↓β[Qw--X4($HI↓↓↓α↓↓β#≥[.uin≠WK∂G⊃l4(HH%↓↓α↓↓↓βGK~o.kQuAlhP$$%α↓↓↓↓αβ∪'∨O#O↔;≡+⊃iw63O∃Xh($$J↓↓↓↓α↓α⊗:#X4($HI↓↓α,r⊂4(HI↓↓↓α↓↓α⊗e~∀4(HH%↓↓∧∩⊗≡&ph($$J↓↓β#N2o.uSk∂WK≡CI5QCX4($HI↓↓β&K∨'S≡+;O↔#QwSK.)l4(HH%↓↓∧*:⊃lhP%↓↓α↓EA1∪R
⊗≡Lp4($LJ→β-s↓αR",p4($J↓↓↓β[AU[xhP$%↓α↓α
⊗<J;ma+Cx4(HI↓↓↓εaiw-Xh($%α↓↓βYSiAl4PH%↓↓αα↑"&d)βSK.)α∩<hP$$&∀*≡&8hP$$&L1β#g5[2uqs↓αR",p4($HI↓↓↓π1iv;/;SK'.{A#-na3#g5[2u32Il4(HH&&→εayAα$B⊗84PH$%↓α↓β1ina5D4PH$&⊗e~∀4(HH%↓↓αα≡>Rz↓MElhP$$&,r⊃l4R↓↓↓↓≠	il4PH%↓↓αβEiuβX4($J↓↓↓α<B&2∃εas-α$x4($HJ
⊗≡Lp4($HK1iwbYEl4PH$'
Sk#∞oeil4(HH'Aio#K'↔e[FulhP$$'6KKOS≡C'3⊃SkSKW+X4($HJ↑"&d)#AyαJε:⊃F→{SKN+∞oBjJ∩<4PH$%↓α↓α
⊗<J84(HH%↓↓αβEiwβX4($HI↓↓↓π↓iwS⊗K↔Jo
il4(HH%↓↓αβ≠'K∨#∂#'f!iw≠∞cO∃lhP$$%α↓↓α⊗t!l4(HH&&→G↓uA&⎇⊃#
s'∪'↔∞←αu&RD*84(HH%↓↓αβmaU?p4($HI↓↓↓∧∩⊗≡&ph($$J↓↓↓αL1βSKN+CSIo#K'↔≡Kk∃α$B⊗84PH$$'␈3↔K≠f{] 4PH$$$J↓Ye]g#K'↔≡Kk∃%Xh($$J↓↓↓β'∪'↔C'⊃iwS⊗K↔CS∩YEl4PH$%↓α↓βSKN+JoS⊗K↔CS∃iiwAXh($$J↓↓↓ββQwSKN+CSIXh($$J↓↓↓β'∪'↔2←αuiuβX4($HI↓↓↓∧J→β≠O∪OS∂FK3⊃α$B⊗84PH$$''∪'↔2←
uiwh($$J↓↓↓α,bN∀4PH$$''∪'↔J←
uiwβX4($HI↓↓↓π#K'↔≥[Buin→l4(HH%↓↓αβSK'.zoBuSiAl4PH$%↓α↓α⊗:#X4($HKEiwβX4($HJ⊗:⊃Xh($%α↓↓α&2βSK'.zoFucqAαRD*84(HH&
⊗<J84(HH'CKNsS;1C9AE%Xh($$L∩⊗≡&ph($$NC↔3Cπ#IiuX4($HK#↔3εc';⊗[αuiu3Iel4PH$&⊗t!l4(HH'↔K⊗{Il4PH$&⊗t!l4(HI↓↓↓π#K'↔⎇[Fuio1l4(HI↓↓↓∧*:⊃lhP$&&2β∂WK≡k⊃uI¬""⊗8hP$%↓α↓α
⊗<J;mM3Kx4(HI↓↓↓∧∩⊗≡&ph($%α↓↓β∨/#;∂S}[↔9lhP$%↓α↓α&→ε≠WK∂n!qyEααR"⊗ph($$N∪π∂/NsCWQXh($%α↓↓α⊗t!l4(HI↓↓↓∧:>R=β→Al4PH%↓↓αα⊗:⊃Xh($'[QuAlhP$'#N2mBuSiAl4PH'∪'>KSO↔w≠↔⊃in3π3O+X4($L*:⊃lhP%↓↓αα>R"-∩Mj
,:&84PH'CKNsS;1C1ea%Xh($&∀*≡&8hP$'#.cCCS∪QuElhP$'#.cC3'v*mBuSiYeeXh($&,r⊃l4PH'↔K⊗{Il4PH'Cπ∨≠3?≡Y!E%Xh($&<zR=↓≠↓l4(HJ⊗:⊂hP%↓↓αα⊗:⊃Xh(&⊗t!l4)α↓↓↓MβQl4)α↓↓βS⊗K↔2m¬iiv∂}kCK↔∨≠SK'*CSK'.bmBuKX4)↓α↓βma+Kz';O#SK'.k↔7=Xh)↓↓αα&→β'∪'↔2[αuqyααR"⊗ph(&
,:&84PJ≠'K∨#≠'QG#K'↔eYBu%Xh(&S⊗K↔Cπ≡Y#SKN+2mBjIl4(L*:⊃lhQ↓↓↓πYaUGw⊃iuAXh)↓↓αα↑"&d)βSKN+Sπ/.roJv$yβIio⊃-ElhQ↓↓↓π#K'↔FO"m¬iiwIXh)↓↓ααSK'.3'a#'∪'↔2[αu%lhQ↓↓↓π⊃iuAXh)↓↓αβ!;KCQuAlhQ↓↓↓εA;	ASiAl4R↓↓↓βBs	Eik↓l4)α↓↓αJ-α⊗εPhP'Mio#K'⊗←∩u;KCX4(''∪'⊗o∃iiw!Xh('ISkMl4R↓↓↓α,rR&1π⊃{SKN+7πaXh)↓↓αα⊗:⊃Xh)↓↓αβmaY∂p4*~,r∞R&|qαCK.s↔Cπ>+S?AG↓k#πf3←?K"Ik#πf3←?K#X4)↓α↓αZε⊂h('C⊗+[AkF3≠←␈∪⊃l4PKEk#∞c≠←?⊗!l4)α↓↓α
,:&84R↓↓↓βπ∪↔[ASiEAAβ→l4)α↓↓β7.jmEAβ↓Nu;FA;K!SkAl4R↓↓↓α<B&2∃π↓qyA∧"<4(L~εN∃εk↔6o¬i;#!v⊃Aα>0h(%↓α↓↓A1
aIkmC1Kz
,:&84PH'Eins↔←O↑KCCπ⊗5!eKX4($Nk↔6oπ∪↔[Bjs#!;⊗AiwEXh($'n+6oFjs#!;⊗AiwAXh($&L1β7↔m[S↔7πβSI-
i;';#s7↔6←↓-NuvK;Qα$B⊗84PH%↓↓αβ7↔6←#↔7Cπ#I-Fjs';QSk7↔6←#↔7Cπ#H4(HH$$%α↓↓↓-
i;';"k7↔6←↓-NuvK;P4PH&⊗2≤(4($J↓↓↓βn+6oS.kCCS∩YFu;NsQiuβX4($O↓iuAXh($&,r⊃l4PI↓↓↓βA1Q1≠R
⊗≡Lp4($OβK↔[βQwAlhP$'ASk7↔6←βK↔[¬i;#!w∪!l4PH&⊗:#X4(%α↓↓↓EαaEE1⊃j
⊗<J84(HKEiwβX4($O↓iw7.joFuvC!;KCX4($Nk↔6o
i;#!w∪!iuβX4($Nk↔6oπ∪↔[Bjs#!;⊗AiwAXh($'6cWO#v{∪↔3O→#E%
		END;
	    OTHERS:confusion(702)
	    END;
    Prunepagetop:=mem[10003].hh.rh;
    END;
    {863}
FUNCTION Vertbreak(p:halfword;
		   h:scaled):halfword;
    LABEL
	30,45,90;
    VAR
	prevp:halfword;
	q,r:halfword;
	pi:integer;
	b:integer;
	leastbadness:integer;
	bestplace:halfword;
	prevdp:scaled;
	t:smallnumber;
    BEGIN
    prevp:=p;
    leastbadness:=1073741823;
    activewidth[1]:=0;
    activewidth[2]:=0;
    activewidth[3]:=0;
    activewidth[4]:=0;
    activewidth[5]:=0;
    activewidth[6]:=0;
    prevdp:=0;
    WHILE true DO
	BEGIN{865}
	IF p=0 THEN
	    pi:=-10000
	ELSE
	    {866}
	    CASE mem[p].hh.
		b0 OF
		0,1,2:BEGIN
		    activewidth[1]:=activewidth[1]+prevdp+mem[p+3].int;
		    prevdp:=mem[p+2].int;
		    GOTO 45;
		    END;
		8:{1242}GOTO 45;
		10:IF(mem[prevp].hh.b0<=9)THEN
		       pi:=0
		   ELSE
		       GOTO 90;
		11:BEGIN
		    IF mem[p].hh.rh=0 THEN
			t:=12
		    ELSE
			t:=mem[mem[p].hh.rh].hh.b0;
		    IF t=10 THEN
			pi:=0
		    ELSE
			GOTO 90;
		    END;
		12:pi:=mem[p+1].int;
		4,3:GOTO 45;
		OTHERS:confusion(703)
		END;
	{867}
	IF pi<10000 THEN
	    BEGIN{868}
	    IF activewidth[1]<h THEN
		IF(activewidth[
			       3]<>0)OR(activewidth[4]<>0)OR(activewidth[5]<>0)THEN
		    b:=0
		ELSE
		    b:=
		    badness(h-activewidth[1],activewidth[2])
	    ELSE
		IF activewidth[1]-h>
		    activewidth[6]THEN
		    b:=1073741823
		ELSE
		    b:=badness(activewidth[1]-h,
			       activewidth[6]);
	    IF b<=10000 THEN
		IF pi<=-10000 THEN
		    b:=pi
		ELSE
		    b:=b+pi;
	    IF b<=leastbadness THEN
		BEGIN
		bestplace:=p;
		leastbadness:=b;
		bestheightpl:=activewidth[1]+prevdp;
		END;
	    IF(b=1073741823)OR(pi<=-10000)THEN
		GOTO 30;
	    END;
	IF(mem[p].hh.b0<10)OR(mem[p].hh.b0>11)THEN
	    GOTO 45;
    90:{869}
	IF mem[p].hh.b0=11 THEN
	    q:=p
	ELSE
	    BEGIN
	    q:=mem[p+1].hh.lh;
	    activewidth[2+mem[q].hh.b0]:=activewidth[2+mem[q].hh.b0]+mem[q+2].int;
	    activewidth[6]:=activewidth[6]+mem[q+3].int;
	    IF(mem[q].hh.b1<>0)AND(mem[q+3].int<>0)THEN
		BEGIN
		printnl(704);
		BEGIN
		helpptr:=4;
		helpline[3]:=705;
		helpline[2]:=706;
		helpline[1]:=707;
		helpline[0]:=674;
		END;
		error;
		r:=newspec(q);
		mem[r].hh.b1:=0;
		deletegluere(q);
		mem[p+1].hh.lh:=r;
		END;
	    END;
	activewidth[1]:=activewidth[1]+prevdp+mem[q+1].int;
	prevdp:=0;
    45:
	IF prevdp>eqtb[4013].int THEN
	    BEGIN
	    activewidth[1]:=activewidth[1]+
	    prevdp-eqtb[4013].int;
	    prevdp:=eqtb[4013].int;
	    END;
	;
	prevp:=p;
	p:=mem[prevp].hh.rh;
	END;
    30:
    Vertbreak:=bestplace;
    END;
    {870}
FUNCTION Vsplit(n:quarterword;
		h:scaled):halfword;
    LABEL
	10,30;
    VAR
	v:halfword;
	p:halfword;
	q:halfword;
    BEGIN
    v:=eqtb[2638+n].hh.rh;
    IF curmark[3]<>0 THEN
	BEGIN
	deletetokenr(curmark[3]);
	curmark[3]:=0;
	deletetokenr(curmark[4]);
	curmark[4]:=0;
	END;
    {871}
    IF v=0 THEN
	BEGIN
	Vsplit:=0;
	GOTO 10;
	END;
    IF mem[v].hh.b0<>1 THEN
	BEGIN
	printnl(708);
	BEGIN
	helpptr:=2;
	helpline[1]:=709;
	helpline[0]:=710;
	END;
	error;
	Vsplit:=0;
	GOTO 10;
	END;
    q:=Vertbreak(mem[v+5].hh.rh,h);
    {872}p:=mem[v+5].hh.rh;
    IF p=q THEN
	mem[v+5].hh.rh:=0
    ELSE
	WHILE true DO
	    BEGIN
	    IF mem[p].hh.b0=4
	    THEN
		IF curmark[3]=0 THEN
		    BEGIN
		    curmark[3]:=mem[p+1].int;
		    curmark[4]:=curmark[3];
		    mem[curmark[3]].hh.lh:=mem[curmark[3]].hh.lh+2;
		    END
		ELSE
		    BEGIN
		    deletetokenr(curmark[4]);
		    curmark[4]:=mem[p+1].int;
		    mem[curmark[4]].hh.lh:=mem[curmark[4]].hh.lh+1;
		    END;
	    IF mem[p].hh.rh=q THEN
		BEGIN
		mem[p].hh.rh:=0;
		GOTO 30;
		END;
	    p:=mem[p].hh.rh;
	    END;
    30:;
    q:=Prunepagetop(q);
    p:=mem[v+5].hh.rh;
    freenode(v,7);
    IF q=0 THEN
	eqtb[2638+n].hh.rh:=0
    ELSE
	eqtb[2638+n].hh.rh:=vpackage(q,0,
				     1,1073741823);
    Vsplit:=vpackage(p,h,0,eqtb[4013].int);
    10:
    END;
    {877}
PROCEDURE Freezepagesp(s:smallnumber);
    BEGIN
    pagecontents:=s;
    pagesize:=eqtb[4011].int;
    pagedepthmax:=eqtb[4012].int;
    curpagedepth:=0;
    pagesofar[1]:=0;
    pagesofar[2]:=0;
    pagesofar[3]:=0;
    pagesofar[4]:=0;
    pagesofar[5]:=0;
    pagesofar[6]:=0;
    leastpagebad:=1073741823;
    END;

{882}PROCEDURE Buildpage;
    LABEL
	10,30,31,22,80,90;
    VAR
	p:halfword;
	q,r,s:halfword;
	prevp:halfword;
	b:integer;
	pi:integer;
	n:0..255;
	delta,h,w:scaled;
	wait:boolean;
    BEGIN
    IF(mem[10001].hh.rh=0)OR outputactive THEN
	GOTO 10;
    REPEAT
    22:
	p:=mem[10001].hh.rh;
	{884}
	IF lastpageglue<>65535 THEN
	    deletegluere(lastpageglue);
	IF mem[p].hh.b0=10 THEN
	    BEGIN
	    lastpageglue:=mem[p+1].hh.lh;
	    mem[lastpageglue].hh.rh:=mem[lastpageglue].hh.rh+1;
	    END
	ELSE
	    lastpageglue:=65535;
	{885}{888}
	CASE mem[p].hh.b0 OF
	    0,1,2:IF pagecontents<2 THEN
		      {889}
		      BEGIN
		      IF
		      pagecontents=0 THEN
			  Freezepagesp(2)
		      ELSE
			  pagecontents:=2;
		      q:=newskipparam(8);
		      mem[q].hh.rh:=p;
		      IF mem[tempptr+1].int>mem[p+3].int THEN
			  mem[tempptr+1].int:=mem[tempptr
						  +1].int-mem[p+3].int
		      ELSE
			  mem[tempptr+1].int:=0;
		      mem[q].hh.rh:=p;
		      mem[10001].hh.rh:=q;
		      GOTO 22;
		      END
		  ELSE
		      {890}
		      BEGIN
		      pagesofar[1]:=pagesofar[1]+curpagedepth+mem[p+3].int;
		      curpagedepth:=mem[p+2].int;
		      GOTO 80;
		      END;
	    8:{1241}GOTO 80;
	    10:IF pagecontents<2 THEN
		   GOTO 31
	       ELSE
		   IF(mem[pagetail].hh.b0<=9)THEN
		       pi
		       :=0
		   ELSE
		       GOTO 90;
	    11:IF pagecontents<2 THEN
		   GOTO 31
	       ELSE
		   IF mem[p].hh.rh=0 THEN
		       GOTO 10
		   ELSE
		       IF mem[mem[p].hh.rh].hh.b0=10 THEN
			   pi:=0
		       ELSE
			   GOTO 90;
	    12:IF pagecontents<2 THEN
		   GOTO 31
	       ELSE
		   pi:=mem[p+1].int;
	    4:GOTO 80;
	    3:{895}BEGIN
		IF pagecontents=0 THEN
		    Freezepagesp(1);
		n:=mem[p].hh.b1;
		r:=10000;
		WHILE n>=mem[mem[r].hh.rh].hh.b1 DO r:=mem[r].hh.rh;
		n:=n;
		IF mem[r].hh.b1<>n THEN
		    {896}
		    BEGIN
		    q:=getnode(4);
		    mem[q].hh.rh:=mem[r].hh.rh;
		    mem[r].hh.rh:=q;
		    r:=q;
		    mem[r].hh.b1:=n;
		    mem[r].hh.b0:=0;
		    IF eqtb[2638+n].hh.rh=0 THEN
			mem[r+1].int:=0
		    ELSE
			mem[r+1].int:=mem[eqtb
					  [2638+n].hh.rh+3].int+mem[eqtb[2638+n].hh.rh+2].int;
		    mem[r+2].hh.lh:=0;
		    q:=eqtb[2379+n].hh.rh;
		    h:=xovern(mem[r+1].int,1000)*eqtb[3622+n].int;
		    pagesize:=pagesize-h;
		    pagesofar[1]:=pagesofar[1]+mem[q+1].int;
		    pagesofar[2+mem[q].hh.b0]:=pagesofar[2+mem[q].hh.b0]+mem[q+2].int;
		    pagesofar[6]:=pagesofar[6]+mem[q+3].int;
		    IF(mem[q].hh.b1<>0)AND(mem[q+3].int<>0)THEN
			BEGIN
			printnl(721);
			printint(n);
			BEGIN
			helpptr:=3;
			helpline[2]:=722;
			helpline[1]:=723;
			helpline[0]:=674;
			END;
			error;
			END;
		    END;
		IF mem[r].hh.b0=0 THEN
		    BEGIN
		    mem[r+2].hh.rh:=p;
		    delta:=pagesize-pagesofar[1]+pagesofar[6];
		    h:=xovern(mem[p+1].int,1000)*eqtb[3622+n].int;
		    IF(h<=delta)AND(mem[p+1].int+mem[r+1].int<=eqtb[4024+n].int)THEN
			BEGIN
			pagesize:=pagesize-h;
			mem[r+1].int:=mem[r+1].int+mem[p+1].int;
			END
		    ELSE
			{897}
			BEGIN
			IF eqtb[3622+n].int<=0 THEN
			    w:=1073741823
			ELSE
			    w:=
			    xovern(delta,eqtb[3622+n].int)*1000;
			IF w>eqtb[4024+n].int-mem[r+1].int THEN
			    w:=eqtb[4024+n].int-mem[r+1].int
			    ;
			q:=Vertbreak(mem[p+2].int,w);
			mem[r+1].int:=mem[r+1].int+bestheightpl;
			bestheightpl:=xovern(bestheightpl,1000)*eqtb[3622+n].int;
			pagesize:=pagesize-bestheightpl;
			mem[r].hh.b0:=1;
			mem[r+3].hh.rh:=q;
			mem[r+3].hh.lh:=p;
			IF q=0 THEN
			    inspenalties:=inspenalties-10000
			ELSE
			    IF mem[q].hh.b0=12
			    THEN
				inspenalties:=inspenalties+mem[q+1].int;
			END;
		    END;
		GOTO 80;
		END;
	    OTHERS:confusion(718)
	    END;
	{893}
	IF pi<10000 THEN
	    BEGIN{894}
	    IF pagesofar[1]<pagesize THEN
		IF(
		   pagesofar[3]<>0)OR(pagesofar[4]<>0)OR(pagesofar[5]<>0)THEN
		    b:=0
		ELSE
		    b:=
		    badness(pagesize-pagesofar[1],pagesofar[2])
	    ELSE
		IF pagesofar[1]-pagesize
		    >pagesofar[6]THEN
		    b:=1073741823
		ELSE
		    b:=badness(pagesofar[1]-pagesize,
			       pagesofar[6]);
	    IF b<=10000 THEN
		IF pi<=-10000 THEN
		    b:=pi
		ELSE
		    b:=b+pi+inspenalties;
	    IF b<=leastpagebad THEN
		BEGIN
		bestpagebrea:=p;
		bestsize:=pagesize;
		leastpagebad:=b;
		r:=mem[10000].hh.rh;
		WHILE r<>10000 DO
		    BEGIN
		    mem[r+2].hh.lh:=mem[r+2].hh.rh;
		    r:=mem[r].hh.rh;
		    END;
		END;
	    IF(b=1073741823)OR(pi<=-10000)THEN
		{898}
		BEGIN{899}
		IF mem[bestpagebrea].hh
		.b0=12 THEN
		    BEGIN
		    geqworddefin(3619,mem[bestpagebrea+1].int);
		    mem[bestpagebrea+1].int:=10000;
		    END
		ELSE
		    geqworddefin(3619,10000);
		IF curmark[2]<>0 THEN
		    BEGIN
		    IF curmark[0]<>0 THEN
			deletetokenr(curmark[0
					     ]);
		    curmark[0]:=curmark[2];
		    mem[curmark[0]].hh.lh:=mem[curmark[0]].hh.lh+1;
		    deletetokenr(curmark[1]);
		    curmark[1]:=0;
		    END;
		{900}
		IF p=bestpagebrea THEN
		    bestpagebrea:=0;
		{901}
		IF eqtb[2893].hh.rh<>0 THEN
		    BEGIN
		    printnl(724);
		    BEGIN
		    helpptr:=2;
		    helpline[1]:=725;
		    helpline[0]:=726;
		    END;
		    error;
		    flushnodelis(eqtb[2893].hh.rh);
		    eqtb[2893].hh.rh:=0;
		    END;
		{904}r:=mem[10000].hh.rh;
		WHILE r<>10000 DO
		    BEGIN
		    IF mem[r+2].hh.lh<>0 THEN
			BEGIN
			n:=mem[r].hh.b1;
			IF eqtb[2638+n].hh.rh=0 THEN
			    eqtb[2638+n].hh.rh:=newnullbox;
			p:=eqtb[2638+n].hh.rh+5;
			WHILE mem[p].hh.rh<>0 DO p:=mem[p].hh.rh;
			mem[r+2].hh.rh:=p;
			END;
		    r:=mem[r].hh.rh;
		    END;
		q:=10004;
		mem[q].hh.rh:=0;
		prevp:=10002;
		p:=mem[prevp].hh.rh;
		WHILE p<>bestpagebrea DO
		    BEGIN
		    IF mem[p].hh.b0=3 THEN
			{906}
			BEGIN
			r:=mem[
			       10000].hh.rh;
			WHILE mem[r].hh.b1<>mem[p].hh.b1 DO r:=mem[r].hh.rh;
			IF mem[r+2].hh.lh=0 THEN
			    wait:=true
			ELSE
			    BEGIN
			    wait:=false;
			    s:=mem[p+2].int;
			    mem[mem[r+2].hh.rh].hh.rh:=s;
			    s:=mem[r+2].hh.rh;
			    IF mem[r+2].hh.lh=p THEN
				{907}
				BEGIN
				IF mem[r].hh.b0=1 THEN
				    IF(mem[r+3].hh
				       .lh=p)AND(mem[r+3].hh.rh<>0)THEN
					BEGIN
					WHILE mem[s].hh.rh<>mem[r+3].hh.
					rh DO s:=mem[s].hh.rh;
					mem[p+2].int:=Prunepagetop(mem[r+3].hh.rh);
					IF mem[p+2].int<>0 THEN
					    BEGIN
					    tempptr:=vpackage(mem[p+2].int,0,1,
							      1073741823);
					    mem[p+1].int:=mem[tempptr+3].int+mem[tempptr+2].int;
					    freenode(tempptr,7);
					    END;
					mem[s].hh.rh:=0;
					wait:=(mem[p+2].int<>0);
					END;
				mem[r+2].hh.lh:=0;
				n:=mem[r].hh.b1;
				tempptr:=mem[eqtb[2638+n].hh.rh+5].hh.rh;
				freenode(eqtb[2638+n].hh.rh,7);
				eqtb[2638+n].hh.rh:=vpackage(tempptr,0,1,1073741823);
				END
			    ELSE
				BEGIN
				WHILE mem[s].hh.rh<>0 DO s:=mem[s].hh.rh;
				mem[r+2].hh.rh:=s;
				END;
			    END;
			{908}mem[prevp].hh.rh:=mem[p].hh.rh;
			mem[p].hh.rh:=0;
			IF wait THEN
			    BEGIN
			    mem[q].hh.rh:=p;
			    q:=p;
			    END
			ELSE
			    freenode(p,3);
			p:=prevp;
			END
		    ELSE
			IF mem[p].hh.b0=4 THEN
			    {902}
			    BEGIN
			    IF curmark[1]=0 THEN
				BEGIN
				curmark[1]:=mem[p+1].int;
				mem[curmark[1]].hh.lh:=mem[curmark[1]].hh.lh+1;
				END;
			    IF curmark[2]<>0 THEN
				deletetokenr(curmark[2]);
			    curmark[2]:=mem[p+1].int;
			    mem[curmark[2]].hh.lh:=mem[curmark[2]].hh.lh+1;
			    END;
		    prevp:=p;
		    p:=mem[prevp].hh.rh;
		    END;
		{903}
		IF p<>0 THEN
		    BEGIN
		    IF mem[10001].hh.rh=0 THEN
			IF nestptr=0 THEN
			    curlist.tailfield:=pagetail
			ELSE
			    nest[0].tailfield:=pagetail;
		    mem[pagetail].hh.rh:=mem[10001].hh.rh;
		    mem[10001].hh.rh:=p;
		    mem[prevp].hh.rh:=0;
		    END;
		eqtb[2893].hh.rh:=vpackage(mem[10002].hh.rh,bestsize,0,pagedepthmax);
		{881}pagecontents:=0;
		pagetail:=10002;
		mem[10002].hh.rh:=0;
		lastpageglue:=65535;
		inspenalties:=0;
		curpagedepth:=0;
		pagedepthmax:=0;;
		IF q<>10004 THEN
		    BEGIN
		    mem[10002].hh.rh:=mem[10004].hh.rh;
		    pagetail:=q;
		    END;
		{905}r:=mem[10000].hh.rh;
		WHILE r<>10000 DO
		    BEGIN
		    q:=mem[r].hh.rh;
		    freenode(r,4);
		    r:=q;
		    END;
		mem[10000].hh.rh:=10000;
		IF(curmark[0]<>0)AND(curmark[1]=0)THEN
		    BEGIN
		    curmark[1]:=curmark[0];
		    mem[curmark[0]].hh.lh:=mem[curmark[0]].hh.lh+1;
		    END;
		IF eqtb[2636].hh.rh<>0 THEN
		    IF deadcycles>=eqtb[3620].int THEN
			{910}
			BEGIN
			printnl(727);
			printint(eqtb[3620].int);
			print(728);
			BEGIN
			helpptr:=3;
			helpline[2]:=729;
			helpline[1]:=730;
			helpline[0]:=731;
			END;
			error;
			END
		    ELSE
			{911}
			BEGIN
			outputactive:=true;
			deadcycles:=deadcycles+1;
			pushnest;
			curlist.modefield:=-1;
			curlist.auxfield:=-65536000;
			curlist.mlfield:=-line;
			begintokenli(eqtb[2636].hh.rh,5);
			newsavelevel(10);
			scanleftbrac;
			GOTO 10;
			END;
		{909}
		BEGIN
		IF mem[10002].hh.rh<>0 THEN
		    BEGIN
		    IF mem[10001].hh.rh=0 THEN
			IF nestptr=0 THEN
			    curlist.tailfield:=pagetail
			ELSE
			    nest[0].tailfield:=
			    pagetail
		    ELSE
			mem[pagetail].hh.rh:=mem[10001].hh.rh;
		    mem[10001].hh.rh:=mem[10002].hh.rh;
		    mem[10002].hh.rh:=0;
		    pagetail:=10002;
		    END;
		shipout(eqtb[2893].hh.rh);
		eqtb[2893].hh.rh:=0;
		GOTO 30;
		END;
		END;
	    END;
	IF(mem[p].hh.b0<10)OR(mem[p].hh.b0>11)THEN
	    GOTO 80;
    90:{892}
	IF mem[p].hh.b0=11 THEN
	    q:=p
	ELSE
	    BEGIN
	    q:=mem[p+1].hh.lh;
	    pagesofar[2+mem[q].hh.b0]:=pagesofar[2+mem[q].hh.b0]+mem[q+2].int;
	    pagesofar[6]:=pagesofar[6]+mem[q+3].int;
	    IF(mem[q].hh.b1<>0)AND(mem[q+3].int<>0)THEN
		BEGIN
		printnl(719);
		BEGIN
		helpptr:=4;
		helpline[3]:=720;
		helpline[2]:=706;
		helpline[1]:=707;
		helpline[0]:=674;
		END;
		error;
		r:=newspec(q);
		mem[r].hh.b1:=0;
		deletegluere(q);
		mem[p+1].hh.lh:=r;
		END;
	    END;
	pagesofar[1]:=pagesofar[1]+curpagedepth+mem[q+1].int;
	curpagedepth:=0;
    80:{891}
	IF curpagedepth>pagedepthmax THEN
	    BEGIN
	    pagesofar[1]:=pagesofar[
				    1]+curpagedepth-pagedepthmax;
	    curpagedepth:=pagedepthmax;
	    END;
	;
	{886}mem[pagetail].hh.rh:=p;
	pagetail:=p;
	mem[10001].hh.rh:=mem[p].hh.rh;
	mem[p].hh.rh:=0;
	GOTO 30;
    31:{887}
	mem[10001].hh.rh:=mem[p].hh.rh;
	mem[p].hh.rh:=0;
	flushnodelis(p);
    30:;
    UNTIL mem[10001].hh.rh=0;
    {883}
    IF nestptr=0 THEN
	curlist.tailfield:=10001
    ELSE
	nest[0].tailfield:=
	10001;
    10:
    END;

{915}{919}PROCEDURE Missingfont;
    BEGIN
    printnl(736);
    BEGIN
    helpptr:=4;
    helpline[3]:=737;
    helpline[2]:=738;
    helpline[1]:=739;
    helpline[0]:=740;
    END;
    error;
    END;
    {929}
PROCEDURE Appspace;
    VAR
	p:halfword;
	q:halfword;
	f:internalfont;
	k:0..fontmemsize;
    BEGIN
    IF(curlist.auxfield>=2000)AND(eqtb[2374].hh.rh<>0)THEN
	q:=
	newparamglue(12)
    ELSE
	BEGIN
	IF eqtb[2373].hh.rh<>0 THEN
	    p:=eqtb[2373].hh.
	    rh
	ELSE
	    {928}
	    BEGIN
	    p:=fontglue[eqtb[2894].hh.rh];
	    IF p=0 THEN
		BEGIN
		f:=eqtb[2894].hh.rh;
		p:=newspec(0);
		k:=parambase[f]+2;
		mem[p+1].int:=fontinfo[k].int;
		mem[p+2].int:=fontinfo[k+1].int;
		mem[p+3].int:=fontinfo[k+2].int;
		fontglue[f]:=p;
		END;
	    END;
	p:=newspec(p);
	{930}
	IF curlist.auxfield>=2000 THEN
	    mem[p+1].int:=mem[p+1].int+fontinfo[
						7+parambase[eqtb[2894].hh.rh]].int;
	mem[p+2].int:=xnoverd(mem[p+2].int,curlist.auxfield,1000);
	mem[p+3].int:=xnoverd(mem[p+3].int,1000,curlist.auxfield);
	q:=newglue(p);
	mem[p].hh.rh:=0;
	END;
    mem[curlist.tailfield].hh.rh:=q;
    curlist.tailfield:=q;
    END;
    {933}
PROCEDURE Insertdollar;
    BEGIN
    printnl(741);
    BEGIN
    helpptr:=2;
    helpline[1]:=742;
    helpline[0]:=743;
    END;
    backerror;
    curcmd:=3;
    curchr:=36;
    curtok:=804;
    END;
    {935}
PROCEDURE Youcant;
    BEGIN
    printnl(744);
    printcmdchr(curcmd,curchr);
    print(745);
    printmode(curlist.modefield);
    END;
    {936}
PROCEDURE Reportillega;
    BEGIN
    Youcant;
    BEGIN
    helpptr:=4;
    helpline[3]:=746;
    helpline[2]:=747;
    helpline[1]:=748;
    helpline[0]:=749;
    END;
    error;
    END;
    {937}
FUNCTION Privileged:boolean;
    BEGIN
    IF curlist.modefield>0 THEN
	Privileged:=true
    ELSE
	BEGIN
	Reportillega;
	Privileged:=false;
	END;
    END;
    {941}
FUNCTION Itsallover:boolean;
    LABEL
	10;
    BEGIN
    IF Privileged THEN
	BEGIN
	IF(10002=pagetail)AND(curlist.headfield=
			      curlist.tailfield)AND((deadcycles=0)OR(deadcycles>=100))THEN
	    BEGIN
	    IF
	    deadcycles>0 THEN
		BEGIN
		printnl(752);
		END;
	    Itsallover:=true;
	    GOTO 10;
	    END;
	backinput;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newnullbox;
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield+1].int:=eqtb[4010].int;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newpenalty(-10000);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	Buildpage;
	END;
    Itsallover:=false;
    10:
    END;
    {948}
PROCEDURE Appendglue;
    VAR
	s:smallnumber;
    BEGIN
    s:=curchr;
    CASE s OF
	0:curval:=4;
	1:curval:=8;
	2:curval:=12;
	3:curval:=16;
	4:scanglue(false);
	5:scanglue(true);
	END;
    BEGIN
    mem[curlist.tailfield].hh.rh:=newglue(curval);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    IF s>=4 THEN
	BEGIN
	mem[curval].hh.rh:=mem[curval].hh.rh-1;
	IF s>4 THEN
	    mem[curlist.tailfield].hh.b1:=99;
	END;
    END;
    {949}
PROCEDURE Appendkern;
    VAR
	s:quarterword;
    BEGIN
    s:=curchr;
    scandimen(s=99,false,false);
    BEGIN
    mem[curlist.tailfield].hh.rh:=newkern(curval);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    mem[curlist.tailfield].hh.b1:=s;
    END;
    {952}
PROCEDURE Offsave;
    VAR
	p:halfword;
    BEGIN
    IF curgroup=0 THEN
	{955}
	BEGIN
	printnl(771);
	printcmdchr(curcmd,curchr);
	BEGIN
	helpptr:=1;
	helpline[0]:=772;
	END;
	error;
	END
    ELSE
	BEGIN
	backinput;
	p:=getavail;
	mem[10003].hh.rh:=p;
	printnl(763);
	{954}
	CASE curgroup OF
	    15:BEGIN
		mem[p].hh.lh:=6454;
		printesc(349);
		END;
	    16:BEGIN
		mem[p].hh.lh:=804;
		printchar(36);
		END;
	    17:BEGIN
		mem[p].hh.lh:=6455;
		mem[p].hh.rh:=getavail;
		p:=mem[p].hh.rh;
		mem[p].hh.lh:=3118;
		printesc(770);
		END;
	    OTHERS:BEGIN
		mem[p].hh.lh:=637;
		printchar(125);
		END
	    END;
	print(764);
	begintokenli(mem[10003].hh.rh,3);
	BEGIN
	helpptr:=5;
	helpline[4]:=765;
	helpline[3]:=766;
	helpline[2]:=767;
	helpline[1]:=768;
	helpline[0]:=769;
	END;
	error;
	END;
    END;
    {958}
PROCEDURE Extrarightbr;
    BEGIN
    printnl(777);
    CASE curgroup OF
	15:printesc(349);
	16:printchar(36);
	17:printesc(630);
	END;
    BEGIN
    helpptr:=5;
    helpline[4]:=778;
    helpline[3]:=779;
    helpline[2]:=780;
    helpline[1]:=781;
    helpline[0]:=782;
    END;
    error;
    alignstate:=alignstate+1;
    END;
    {964}
PROCEDURE Boxend;
    VAR
	p:halfword;
    BEGIN
    IF savestack[saveptr+0].int<1073741824 THEN
	{965}
	BEGIN
	IF curbox<>0
	THEN
	    BEGIN
	    mem[curbox+4].int:=savestack[saveptr+0].int;
	    IF Abs(curlist.modefield)=1 THEN
		BEGIN
		appendtovlis(curbox);
		IF curlist.modefield>0 THEN
		    Buildpage;
		END
	    ELSE
		BEGIN
		IF Abs(curlist.modefield)=185 THEN
		    BEGIN
		    p:=newnoad;
		    mem[p+1].hh.rh:=2;
		    mem[p+1].hh.lh:=curbox;
		    curbox:=p;
		    END;
		mem[curlist.tailfield].hh.rh:=curbox;
		curlist.tailfield:=curbox;
		END;
	    END;
	END
    ELSE
	IF savestack[saveptr+0].int<1073742336 THEN
	    {966}
	    IF savestack[
			 saveptr+0].int<1073742080 THEN
		eqdefine(-1073739186+savestack[saveptr+0]
			 .int,100,curbox)
	    ELSE
		geqdefine(-1073739442+savestack[saveptr+0].int,100,
			  curbox)
	ELSE
	    IF curbox<>0 THEN
		IF savestack[saveptr+0].int>1073742336
		THEN
		    {967}
		    BEGIN{366}
		    REPEAT
			getnctoken;
		    UNTIL curcmd<>10;
		    IF((curcmd=26)AND(Abs(curlist.modefield)<>1))OR((curcmd=27)AND(Abs(
										       curlist.modefield)=1))THEN
			BEGIN
			Appendglue;
			mem[curlist.tailfield].hh.b1:=savestack[saveptr+0].int-(1073742237);
			mem[curlist.tailfield+1].hh.rh:=curbox;
			END
		    ELSE
			BEGIN
			printnl(798);
			BEGIN
			helpptr:=3;
			helpline[2]:=799;
			helpline[1]:=800;
			helpline[0]:=801;
			END;
			error;
			flushnodelis(curbox);
			END;
		    END
		ELSE
		    shipout(curbox);
    END;

{968}PROCEDURE Beginbox;
    LABEL
	10;
    VAR
	p:halfword;
	k:halfword;
	n:eightbits;
    BEGIN
    CASE curchr OF
	0:BEGIN
	    scaneightbit;
	    curbox:=eqtb[2638+curval].hh.rh;
	    eqtb[2638+curval].hh.rh:=0;
	    END;
	1:BEGIN
	    scaneightbit;
	    curbox:=copynodelist(eqtb[2638+curval].hh.rh);
	    END;
	2:{969}BEGIN
	    curbox:=0;
	    IF(curlist.modefield=1)AND(curlist.headfield=curlist.tailfield)THEN
		{970}
		BEGIN
		Youcant;
		BEGIN
		helpptr:=2;
		helpline[1]:=802;
		helpline[0]:=803;
		END;
		error;
		END
	    ELSE
		BEGIN
		IF NOT(curlist.tailfield>10000)THEN
		    IF(mem[curlist.
			   tailfield].hh.b0=0)OR(mem[curlist.tailfield].hh.b0=1)THEN
			BEGIN
			p:=
			curlist.headfield;
			curbox:=curlist.tailfield;
			WHILE mem[p].hh.rh<>curlist.tailfield DO p:=mem[p].hh.rh;
			curlist.tailfield:=p;
			mem[p].hh.rh:=0;
			END;
		END;
	    END;
	3:{971}BEGIN
	    scaneightbit;
	    n:=curval;
	    IF NOT scankeyword(596)THEN
		BEGIN
		printnl(804);
		BEGIN
		helpptr:=2;
		helpline[1]:=805;
		helpline[0]:=806;
		END;
		error;
		END;
	    scandimen(false,false,false);
	    curbox:=Vsplit(n,curval);
	    END;
	OTHERS:{972}BEGIN
	    k:=curchr-4;
	    saveptr:=saveptr+1;
	    scanspec;
	    IF k=93 THEN
		newsavelevel(2)
	    ELSE
		IF k=1 THEN
		    newsavelevel(3)
		ELSE
		    BEGIN
		    newsavelevel(4);
		    k:=1;
		    END;
	    pushnest;
	    curlist.modefield:=-k;
	    IF k=1 THEN
		curlist.auxfield:=-65536000
	    ELSE
		curlist.auxfield:=1000;
	    GOTO 10;
	    END
	END;
    Boxend;
    10:
    END;
    {973}
PROCEDURE Scanbox;
    BEGIN{366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    IF curcmd=21 THEN
	Beginbox
    ELSE
	IF(savestack[saveptr+0].int>=1073742337)
	    AND((curcmd=36)OR(curcmd=35))THEN
	    BEGIN
	    curbox:=scanrulespec;
	    Boxend;
	    END
	ELSE
	    BEGIN
	    printnl(807);
	    BEGIN
	    helpptr:=3;
	    helpline[2]:=808;
	    helpline[1]:=809;
	    helpline[0]:=810;
	    END;
	    backerror;
	    END;
    END;
    {975}
PROCEDURE Package(c:smallnumber);
    VAR
	h:scaled;
	f:internalfont;
	p:halfword;
    BEGIN
    unsave;
    saveptr:=saveptr-3;
    IF curlist.modefield=-93 THEN
	curbox:=hpack(mem[curlist.headfield].hh.rh
		      ,savestack[saveptr+2].int,savestack[saveptr+1].int)
    ELSE
	BEGIN
	curbox:=
	vpackage(mem[curlist.headfield].hh.rh,savestack[saveptr+2].int,savestack
		 [saveptr+1].int,1073741823);
	IF c=4 THEN
	    {976}
	    BEGIN
	    h:=0;
	    p:=mem[curbox+5].hh.rh;
	    IF p<>0 THEN
		IF(mem[p].hh.b0=0)OR(mem[p].hh.b0=1)OR(mem[p].hh.b0=2)THEN
		    h:=mem[p+3].int;
	    mem[curbox+2].int:=mem[curbox+2].int-h+mem[curbox+3].int;
	    mem[curbox+3].int:=h;
	    END;
	END;
    popnest;
    Boxend;
    END;
    {981}
PROCEDURE Newgraf(indented:boolean);
    BEGIN
    curlist.alreadyfield:=0;
    IF(curlist.modefield=1)OR(curlist.headfield<>curlist.tailfield)THEN
	BEGIN
	mem[curlist.tailfield].hh.rh:=newparamglue(2);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
    pushnest;
    curlist.modefield:=93;
    curlist.auxfield:=1000;
    IF indented THEN
	BEGIN
	curlist.tailfield:=newnullbox;
	mem[curlist.headfield].hh.rh:=curlist.tailfield;
	mem[curlist.tailfield+1].int:=eqtb[4006].int;
	END;
    IF eqtb[2637].hh.rh<>0 THEN
	begintokenli(eqtb[2637].hh.rh,6);
    IF nestptr=1 THEN
	Buildpage;
    END;
    {983}
PROCEDURE Indentinhmod;
    BEGIN
    IF curchr>0 THEN
	BEGIN
	BEGIN
	mem[curlist.tailfield].hh.rh:=
	newnullbox;
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield+1].int:=eqtb[4006].int;
	END;
    END;
    {985}
PROCEDURE Endgraf;
    BEGIN
    IF curlist.modefield=93 THEN
	BEGIN
	IF curlist.headfield=curlist.
	tailfield THEN
	    popnest
	ELSE
	    Linebreak(eqtb[3589].int);
	IF eqtb[3602].int<>0 THEN
	    eqworddefine(3602,0);
	IF eqtb[4023].int<>0 THEN
	    eqworddefine(4023,0);
	IF eqtb[2635].hh.rh<>0 THEN
	    eqdefine(2635,99,0);
	errorcount:=0;
	END;
    END;
    {988}
PROCEDURE Begininserto;
    BEGIN
    IF curlist.modefield<-1 THEN
	Reportillega
    ELSE
	BEGIN
	IF curcmd=38
	THEN
	    curval:=255
	ELSE
	    BEGIN
	    scaneightbit;
	    IF curval=255 THEN
		BEGIN
		printnl(813);
		BEGIN
		helpptr:=1;
		helpline[0]:=814;
		END;
		error;
		curval:=0;
		END;
	    END;
	savestack[saveptr+0].int:=curval;
	saveptr:=saveptr+1;
	newsavelevel(13);
	scanleftbrac;
	pushnest;
	curlist.modefield:=-1;
	curlist.auxfield:=-65536000;
	END;
    END;
    {990}
PROCEDURE Makemark;
    VAR
	p:halfword;
    BEGIN
    IF curlist.modefield<-1 THEN
	Reportillega
    ELSE
	BEGIN
	p:=scantoks(
		    false,true);
	p:=getnode(2);
	mem[p].hh.b0:=4;
	mem[p].hh.b1:=0;
	mem[p+1].int:=defref;
	mem[curlist.tailfield].hh.rh:=p;
	curlist.tailfield:=p;
	END;
    END;
    {992}
PROCEDURE Changeaux;
    BEGIN
    IF curchr<>Abs(curlist.modefield)THEN
	Reportillega
    ELSE
	BEGIN
	scanoptional;
	IF curchr=1 THEN
	    BEGIN
	    scandimen(false,false,false);
	    curlist.auxfield:=curval;
	    END
	ELSE
	    BEGIN
	    scanint;
	    IF(curval<=0)OR(curval>65536)THEN
		BEGIN
		printnl(815);
		BEGIN
		helpptr:=1;
		helpline[0]:=816;
		END;
		interror(curval);
		END
	    ELSE
		curlist.auxfield:=curval;
	    END;
	END;
    END;
    {994}
PROCEDURE Appendpenalt;
    BEGIN
    scanint;
    BEGIN
    mem[curlist.tailfield].hh.rh:=newpenalty(curval);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    IF curlist.modefield=1 THEN
	Buildpage;
    END;
    {996}
PROCEDURE Deleteskip;
    VAR
	p:halfword;
    BEGIN
    IF(curlist.modefield=1)AND(curlist.tailfield=curlist.headfield)
    THEN
	{997}
	BEGIN
	Youcant;
	BEGIN
	helpptr:=2;
	helpline[1]:=802;
	helpline[0]:=817;
	END;
	error;
	END
    ELSE
	BEGIN
	IF NOT(curlist.tailfield>10000)THEN
	    IF mem[curlist.
		   tailfield].hh.b0=10 THEN
		BEGIN
		p:=curlist.headfield;
		WHILE mem[p].hh.rh<>curlist.tailfield DO p:=mem[p].hh.rh;
		mem[p].hh.rh:=0;
		flushnodelis(curlist.tailfield);
		curlist.tailfield:=p;
		END;
	END;
    END;

{999}PROCEDURE Unpackage;
    VAR
	p:halfword;
    BEGIN
    scaneightbit;
    p:=eqtb[2638+curval].hh.rh;
    IF p<>0 THEN
	IF((Abs(curlist.modefield)=1)AND(mem[p].hh.b0=1))OR((Abs(
								 curlist.modefield)=93)AND(mem[p].hh.b0=0))THEN
	    BEGIN
	    mem[curlist.
		tailfield].hh.rh:=mem[p+5].hh.rh;
	    eqtb[2638+curval].hh.rh:=0;
	    freenode(p,7);
	    WHILE mem[curlist.tailfield].hh.rh<>0 DO curlist.tailfield:=mem[curlist.
									    tailfield].hh.rh;
	    END
	ELSE
	    BEGIN
	    printnl(818);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=819;
	    helpline[0]:=820;
	    END;
	    error;
	    END;
    END;
    {1002}
PROCEDURE Appenditalic;
    VAR
	f:internalfont;
    BEGIN
    IF(curlist.tailfield>10000)AND(curlist.tailfield<>curlist.
				   headfield)THEN
	BEGIN
	f:=mem[curlist.tailfield].hh.b0;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newkern(fontinfo[italicbase[f]+
						       fontinfo[charbase[f]+mem[curlist.tailfield].hh.b1].qqqq.b2 DIV 4].int);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	END;
    END;
    {1006}
PROCEDURE Appenddiscre;
    BEGIN
    BEGIN
    mem[curlist.tailfield].hh.rh:=newdisc;
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    IF curchr=1 THEN
	mem[curlist.tailfield+1].hh.lh:=newcharacter(eqtb[2894]
						     .hh.rh,45)
    ELSE
	BEGIN
	saveptr:=saveptr+1;
	savestack[saveptr-1].int:=0;
	scanleftbrac;
	newsavelevel(12);
	pushnest;
	curlist.modefield:=-93;
	END;
    END;
    {1008}
PROCEDURE Builddiscret;
    LABEL
	30,10;
    VAR
	p,q:halfword;
	n:integer;
    BEGIN
    unsave;
    {1010}q:=curlist.headfield;
    p:=mem[q].hh.rh;
    n:=0;
    WHILE p<>0 DO
	BEGIN
	IF NOT(p>10000)THEN
	    IF(mem[p].hh.b0<>11)AND(mem[p].
				    hh.b0<>6)THEN
		BEGIN
		printnl(827);
		begindiagnos;
		showbox(p);
		enddiagnosti(true);
		BEGIN
		helpptr:=1;
		helpline[0]:=828;
		END;
		error;
		flushnodelis(p);
		mem[q].hh.rh:=0;
		GOTO 30;
		END;
	q:=p;
	p:=mem[q].hh.rh;
	n:=n+1;
	END;
    30:;
    p:=mem[curlist.headfield].hh.rh;
    popnest;
    CASE savestack[saveptr-1].int OF
	0:mem[curlist.tailfield+1].hh.lh:=p;
	1:mem[curlist.tailfield+1].hh.rh:=p;
	2:{1009}BEGIN
	    IF(n>0)AND(Abs(curlist.modefield)=185)THEN
		BEGIN
		printnl(
			821);
		BEGIN
		helpptr:=2;
		helpline[1]:=822;
		helpline[0]:=823;
		END;
		flushnodelis(p);
		n:=0;
		error;
		END
	    ELSE
		mem[curlist.tailfield].hh.rh:=p;
	    IF n<128 THEN
		mem[curlist.tailfield].hh.b1:=n
	    ELSE
		BEGIN
		printnl(824);
		BEGIN
		helpptr:=2;
		helpline[1]:=825;
		helpline[0]:=826;
		END;
		error;
		END;
	    IF n>0 THEN
		curlist.tailfield:=q;
	    saveptr:=saveptr-1;
	    GOTO 10;
	    END;
	END;
    savestack[saveptr-1].int:=savestack[saveptr-1].int+1;
    scanleftbrac;
    newsavelevel(12);
    pushnest;
    curlist.modefield:=-93;
    10:
    END;
    {1012}
PROCEDURE Insthe;
    BEGIN
    printnl(829);
    BEGIN
    helpptr:=3;
    helpline[2]:=830;
    helpline[1]:=831;
    helpline[0]:=832;
    END;
    backerror;
    mem[10011].hh.rh:=thetoks(false);
    begintokenli(mem[10003].hh.rh,3);
    END;
    {1015}
PROCEDURE Makeaccent;
    VAR
	s,t:real;
	p,q:halfword;
	f:internalfont;
	a,h,x,w,delta:scaled;
	i:fourquarters;
    BEGIN
    scancharnum;
    f:=eqtb[2894].hh.rh;
    p:=newcharacter(f,curval);
    IF p<>0 THEN
	BEGIN
	x:=fontinfo[5+parambase[f]].int;
	s:=fontinfo[1+parambase[f]].int/65536.0;
	a:=fontinfo[widthbase[f]+fontinfo[charbase[f]+mem[p].hh.b1].qqqq.b0].int
	;
	Doassignment;
	{1016}q:=0;
	f:=eqtb[2894].hh.rh;
	IF(curcmd=11)OR(curcmd=12)THEN
	    q:=newcharacter(f,curchr)
	ELSE
	    IF curcmd=
	    16 THEN
		BEGIN
		scancharnum;
		q:=newcharacter(f,curval);
		END
	    ELSE
		backinput;
	IF q<>0 THEN
	    {1017}
	    BEGIN
	    t:=fontinfo[1+parambase[f]].int/65536.0;
	    i:=fontinfo[charbase[f]+mem[q].hh.b1].qqqq;
	    w:=fontinfo[widthbase[f]+i.b0].int;
	    h:=fontinfo[heightbase[f]+i.b1 DIV 16].int;
	    IF h<>x THEN
		BEGIN
		p:=hpack(p,0,1);
		mem[p+4].int:=x-h;
		END;
	    delta:=Round((w-a)/2+h*t-x*s);
	    mem[curlist.tailfield].hh.rh:=newkern(delta);
	    mem[mem[curlist.tailfield].hh.rh].hh.rh:=p;
	    mem[p].hh.rh:=newkern(-a-delta);
	    curlist.tailfield:=mem[p].hh.rh;
	    p:=q;
	    END;
	mem[curlist.tailfield].hh.rh:=p;
	curlist.tailfield:=p;
	END;
    END;
    {1019}
PROCEDURE Alignerror;
    BEGIN
    IF Abs(alignstate)>2 THEN
	{1020}
	BEGIN
	printnl(837);
	IF curtok=1062 THEN
	    BEGIN
	    BEGIN
	    helpptr:=6;
	    helpline[5]:=838;
	    helpline[4]:=839;
	    helpline[3]:=840;
	    helpline[2]:=841;
	    helpline[1]:=842;
	    helpline[0]:=843;
	    END;
	    END
	ELSE
	    BEGIN
	    BEGIN
	    helpptr:=5;
	    helpline[4]:=838;
	    helpline[3]:=844;
	    helpline[2]:=841;
	    helpline[1]:=842;
	    helpline[0]:=843;
	    END;
	    END;
	error;
	curcmd:=0;
	END
    ELSE
	BEGIN
	backinput;
	IF alignstate<0 THEN
	    BEGIN
	    printnl(451);
	    curcmd:=1;
	    alignstate:=alignstate+1;
	    curtok:=379;
	    END
	ELSE
	    BEGIN
	    printnl(833);
	    curcmd:=2;
	    alignstate:=alignstate-1;
	    curtok:=637;
	    END;
	BEGIN
	helpptr:=3;
	helpline[2]:=834;
	helpline[1]:=835;
	helpline[0]:=836;
	END;
	error;
	END;
    END;
    {1021}
PROCEDURE Noalignerror;
    BEGIN
    printnl(845);
    BEGIN
    helpptr:=2;
    helpline[1]:=846;
    helpline[0]:=847;
    END;
    error;
    END;
PROCEDURE Omiterror;
    BEGIN
    printnl(848);
    BEGIN
    helpptr:=2;
    helpline[1]:=849;
    helpline[0]:=847;
    END;
    error;
    END;
    {1024}
PROCEDURE Doendv;
    BEGIN
    IF curgroup=8 THEN
	BEGIN
	Endgraf;
	unsave;
	newsavelevel(8);
	IF Fincol THEN
	    Finrow;
	END
    ELSE
	Offsave;
    END;

{1027}PROCEDURE Initmath;
    LABEL
	21,40,45,30,10;
    VAR
	w:scaled;
	l:scaled;
	s:scaled;
	p:halfword;
	q:halfword;
	f:internalfont;
	n:integer;
	v:scaled;
	d:scaled;
    BEGIN{1029}
    IF(fontparams[eqtb[2897].hh.rh]<22)OR(fontparams[eqtb[2913].
						     hh.rh]<22)OR(fontparams[eqtb[2929].hh.rh]<22)THEN
	BEGIN
	printnl(850);
	BEGIN
	helpptr:=3;
	helpline[2]:=851;
	helpline[1]:=852;
	helpline[0]:=853;
	END;
	error;
	GOTO 10;
	END
    ELSE
	IF(fontparams[eqtb[2898].hh.rh]<13)OR(fontparams[eqtb[2914].hh.
							 rh]<13)OR(fontparams[eqtb[2930].hh.rh]<13)THEN
	    BEGIN
	    printnl(854);
	    BEGIN
	    helpptr:=3;
	    helpline[2]:=855;
	    helpline[1]:=856;
	    helpline[0]:=857;
	    END;
	    error;
	    GOTO 10;
	    END;
    getnctoken;
    IF(curcmd=3)AND(curlist.modefield>0)THEN
	{1035}
	BEGIN
	IF curlist.headfield
	=curlist.tailfield THEN
	    BEGIN
	    popnest;
	    w:=-1073741823;
	    END
	ELSE
	    BEGIN
	    Linebreak(eqtb[3590].int);
	    {1036}v:=mem[justbox+4].int+2*fontinfo[6+parambase[eqtb[2894].hh.rh]].
	    int;
	    w:=-1073741823;
	    p:=mem[justbox+5].hh.rh;
	    WHILE p<>0 DO
		BEGIN{1037}
    21:
		IF(p>10000)THEN
		    BEGIN
		    f:=mem[p].hh.b0;
		    d:=fontinfo[widthbase[f]+fontinfo[charbase[f]+mem[p].hh.b1].qqqq.b0].int
		    ;
		    GOTO 40;
		    END;
		CASE mem[p].hh.b0 OF
		    0,1,2:BEGIN
			d:=mem[p+1].int;
			GOTO 40;
			END;
		    6:{563}BEGIN
			mem[10011]:=mem[p+1];
			mem[10011].hh.rh:=mem[p].hh.rh;
			p:=10011;
			GOTO 21;
			END;
		    11,9:d:=mem[p+1].int;
		    10:{1038}BEGIN
			q:=mem[p+1].hh.lh;
			d:=mem[q+1].int;
			IF((mem[justbox+5].hh.b0=1)AND(mem[justbox+5].hh.b1=mem[q].hh.b0))OR((
											      mem[justbox+5].hh.b0=2)AND(mem[justbox+5].hh.b1=mem[q].hh.b1))THEN
			    v:=
			    1073741823;
			IF mem[p].hh.b1>=100 THEN
			    GOTO 40;
			END;
		    8:{1239}d:=0;
		    OTHERS:d:=0
		    END;
		IF v<1073741823 THEN
		    v:=v+d;
		GOTO 45;
    40:
		IF v<1073741823 THEN
		    BEGIN
		    v:=v+d;
		    w:=v;
		    END
		ELSE
		    BEGIN
		    w:=1073741823;
		    GOTO 30;
		    END;
    45:
		p:=mem[p].hh.rh;
		END;
    30:;
	    END;
	{1039}
	IF eqtb[2635].hh.rh=0 THEN
	    IF(eqtb[4023].int<>0)AND(((eqtb[3621].
				       int>=0)AND(curlist.alreadyfield+2>eqtb[3621].int))OR(curlist.
											    alreadyfield+1<-eqtb[3621].int))THEN
		BEGIN
		l:=eqtb[4010].int-Abs(eqtb[
					   4023].int);
		IF eqtb[4023].int>0 THEN
		    s:=eqtb[4023].int
		ELSE
		    s:=0;
		END
	    ELSE
		BEGIN
		l:=eqtb[4010].int;
		s:=0;
		END
	ELSE
	    BEGIN
	    n:=mem[eqtb[2635].hh.rh].hh.lh;
	    IF curlist.alreadyfield+2>=n THEN
		p:=eqtb[2635].hh.rh+2*n
	    ELSE
		p:=eqtb[
			2635].hh.rh+2*(curlist.alreadyfield+2);
	    s:=mem[p-1].int;
	    l:=mem[p].int;
	    END;
	pushnest;
	curlist.modefield:=185;
	curlist.auxfield:=0;
	newsavelevel(16);
	eqdefine(2943,101,1);
	eqworddefine(4019,w);
	eqworddefine(4020,l);
	eqworddefine(4021,s);
	IF nestptr=1 THEN
	    Buildpage;
	END
    ELSE
	BEGIN
	backinput;
	{1028}
	BEGIN
	pushnest;
	curlist.modefield:=-185;
	curlist.auxfield:=0;
	newsavelevel(16);
	eqdefine(2943,101,1);
	END;
	END;
    10:
    END;
    {1032}
PROCEDURE Starteqno;
    BEGIN
    IF curgroup=16 THEN
	BEGIN
	savestack[saveptr+0].int:=curchr;
	saveptr:=saveptr+1;
	{1028}
	BEGIN
	pushnest;
	curlist.modefield:=-185;
	curlist.auxfield:=0;
	newsavelevel(16);
	eqdefine(2943,101,1);
	END;
	END
    ELSE
	Offsave;
    END;
    {1041}
PROCEDURE Scanmath(p:halfword);
    LABEL
	10;
    VAR
	c:integer;
    BEGIN{366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    CASE curcmd OF
	11,12:c:=eqtb[3072+curchr].hh.rh;
	16:BEGIN
	    scancharnum;
	    c:=curval+28672;
	    END;
	17:BEGIN
	    scanfifteenb;
	    c:=curval;
	    END;
	15:BEGIN
	    scantwentyse;
	    c:=curval DIV 4096;
	    END;
	OTHERS:{1042}BEGIN
	    backinput;
	    scanleftbrac;
	    savestack[saveptr+0].int:=p;
	    saveptr:=saveptr+1;
	    newsavelevel(11);
	    pushnest;
	    curlist.auxfield:=0;
	    END
	END;
    mem[p].hh.rh:=1;
    mem[p].hh.b1:=c MOD 256;
    IF c>=28672 THEN
	mem[p].hh.b0:=eqtb[2943].hh.rh
    ELSE
	mem[p].hh.b0:=(c
		       DIV 256)MOD 16;
    GOTO 10;
    10:
    END;
    {1044}
PROCEDURE Setmathchar(c:integer);
    VAR
	p:halfword;
    BEGIN
    p:=newnoad;
    mem[p+1].hh.rh:=1;
    mem[p+1].hh.b1:=c MOD 256;
    IF c>=28672 THEN
	BEGIN
	mem[p+1].hh.b0:=eqtb[2943].hh.rh;
	mem[p].hh.b0:=15;
	END
    ELSE
	BEGIN
	mem[p+1].hh.b0:=(c DIV 256)MOD 16;
	mem[p].hh.b0:=15+(c DIV 4096);
	END;
    mem[curlist.tailfield].hh.rh:=p;
    curlist.tailfield:=p;
    END;
    {1048}
PROCEDURE Mathlimitswi;
    LABEL
	10;
    BEGIN
    IF curlist.headfield<>curlist.tailfield THEN
	IF mem[curlist.
	       tailfield].hh.b0=16 THEN
	    BEGIN
	    mem[curlist.tailfield].hh.b1:=1-mem[
						curlist.tailfield].hh.b1;
	    GOTO 10;
	    END;
    printnl(860);
    BEGIN
    helpptr:=1;
    helpline[0]:=861;
    END;
    10:
    END;
    {1049}
PROCEDURE Scandelimite(p:halfword;
		       r:boolean);
    BEGIN
    IF r THEN
	scantwentyse
    ELSE
	BEGIN{366}
	REPEAT
	    getnctoken;
	UNTIL curcmd<>10;
	CASE curcmd OF
	    11,12:curval:=eqtb[3878+curchr].int;
	    15:scantwentyse;
	    OTHERS:curval:=-1
	    END;
	END;
    IF curval<0 THEN
	{1050}
	BEGIN
	printnl(862);
	BEGIN
	helpptr:=6;
	helpline[5]:=863;
	helpline[4]:=864;
	helpline[3]:=865;
	helpline[2]:=866;
	helpline[1]:=867;
	helpline[0]:=868;
	END;
	backerror;
	curval:=0;
	END;
    mem[p].qqqq.b0:=(curval DIV 1048576)MOD 16;
    mem[p].qqqq.b1:=(curval DIV 4096)MOD 256;
    mem[p].qqqq.b2:=(curval DIV 256)MOD 16;
    mem[p].qqqq.b3:=curval MOD 256;
    END;
    {1052}
PROCEDURE Mathradical;
    BEGIN
    BEGIN
    mem[curlist.tailfield].hh.rh:=getnode(5);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    mem[curlist.tailfield].hh.b0:=23;
    mem[curlist.tailfield].hh.b1:=0;
    mem[curlist.tailfield+1].hh:=emptyfield;
    mem[curlist.tailfield+3].hh:=emptyfield;
    mem[curlist.tailfield+2].hh:=emptyfield;
    Scandelimite(curlist.tailfield+4,true);
    Scanmath(curlist.tailfield+1);
    END;

{1054}PROCEDURE Mathac;
    BEGIN
    BEGIN
    mem[curlist.tailfield].hh.rh:=getnode(5);
    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
    END;
    mem[curlist.tailfield].hh.b0:=27;
    mem[curlist.tailfield].hh.b1:=0;
    mem[curlist.tailfield+1].hh:=emptyfield;
    mem[curlist.tailfield+3].hh:=emptyfield;
    mem[curlist.tailfield+2].hh:=emptyfield;
    mem[curlist.tailfield+4].hh.rh:=1;
    scanfifteenb;
    mem[curlist.tailfield+4].hh.b1:=curval MOD 256;
    IF curval>=28672 THEN
	mem[curlist.tailfield+4].hh.b0:=eqtb[2943].hh.rh
    ELSE
	mem[curlist.tailfield+4].hh.b0:=(curval DIV 256)MOD 16;
    Scanmath(curlist.tailfield+1);
    END;
    {1060}
PROCEDURE Mathnonscrip;
    BEGIN{366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    IF(curcmd>30)OR(curcmd<26)THEN
	BEGIN
	printnl(869);
	BEGIN
	helpptr:=2;
	helpline[1]:=870;
	helpline[0]:=871;
	END;
	backerror;
	END
    ELSE
	BEGIN
	backinput;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newglue(0);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield].hh.b1:=98;
	END;
    END;
    {1062}
PROCEDURE Subsup;
    VAR
	t:smallnumber;
	p:halfword;
    BEGIN
    t:=0;
    p:=0;
    IF curlist.tailfield<>curlist.headfield THEN
	IF(mem[curlist.tailfield].
	   hh.b0>=15)AND(mem[curlist.tailfield].hh.b0<29)THEN
	    BEGIN
	    p:=curlist.
	    tailfield+2+curcmd-7;
	    t:=mem[p].hh.rh;
	    END;
    IF(p=0)OR(t<>0)THEN
	{1063}
	BEGIN
	BEGIN
	mem[curlist.tailfield].hh.rh:=
	newnoad;
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	mem[curlist.tailfield].hh.b0:=15;
	p:=curlist.tailfield+2+curcmd-7;
	IF t<>0 THEN
	    BEGIN
	    IF curcmd=7 THEN
		BEGIN
		printnl(872);
		BEGIN
		helpptr:=1;
		helpline[0]:=873;
		END;
		END
	    ELSE
		BEGIN
		printnl(874);
		BEGIN
		helpptr:=1;
		helpline[0]:=875;
		END;
		END;
	    error;
	    END;
	END;
    Scanmath(p);
    END;
    {1067}
PROCEDURE Mathfraction;
    VAR
	c:smallnumber;
    BEGIN
    c:=curchr;
    IF curlist.auxfield<>0 THEN
	{1069}
	BEGIN
	IF c MOD 3=0 THEN
	    scandimen(false
		      ,false,false);
	IF c>=3 THEN
	    BEGIN
	    Scandelimite(10011,false);
	    Scandelimite(10011,false);
	    END;
	printnl(881);
	BEGIN
	helpptr:=3;
	helpline[2]:=882;
	helpline[1]:=883;
	helpline[0]:=884;
	END;
	error;
	END
    ELSE
	BEGIN
	curlist.auxfield:=getnode(6);
	mem[curlist.auxfield].hh.b0:=24;
	mem[curlist.auxfield].hh.b1:=0;
	mem[curlist.auxfield+2].hh.rh:=3;
	mem[curlist.auxfield+2].hh.lh:=mem[curlist.headfield].hh.rh;
	mem[curlist.auxfield+3].hh:=emptyfield;
	mem[curlist.auxfield+4].qqqq:=nullcharacte;
	mem[curlist.auxfield+5].qqqq:=nullcharacte;
	mem[curlist.headfield].hh.rh:=0;
	curlist.tailfield:=curlist.headfield;
	{1068}
	CASE c MOD 3 OF
	    0:BEGIN
		scandimen(false,false,false);
		mem[curlist.auxfield+1].int:=curval;
		END;
	    1:mem[curlist.auxfield+1].int:=1073741824;
	    2:mem[curlist.auxfield+1].int:=0;
	    END;
	IF c>=3 THEN
	    BEGIN
	    Scandelimite(curlist.auxfield+4,false);
	    Scandelimite(curlist.auxfield+5,false);
	    END;
	END;
    END;
    {1070}
FUNCTION Finmlist(p:halfword):halfword;
    VAR
	q:halfword;
    BEGIN
    IF curlist.auxfield<>0 THEN
	{1071}
	BEGIN
	mem[curlist.auxfield+3].hh.
	rh:=3;
	mem[curlist.auxfield+3].hh.lh:=mem[curlist.headfield].hh.rh;
	IF p=0 THEN
	    q:=curlist.auxfield
	ELSE
	    BEGIN
	    q:=mem[curlist.auxfield+2].hh
	    .lh;
	    IF mem[q].hh.b0<>29 THEN
		confusion(630);
	    mem[curlist.auxfield+2].hh.lh:=mem[q].hh.rh;
	    mem[q].hh.rh:=curlist.auxfield;
	    mem[curlist.auxfield].hh.rh:=p;
	    END;
	END
    ELSE
	BEGIN
	mem[curlist.tailfield].hh.rh:=p;
	q:=mem[curlist.headfield].hh.rh;
	END;
    popnest;
    Finmlist:=q;
    END;
    {1076}
PROCEDURE Mathleftrigh;
    VAR
	t:smallnumber;
	p:halfword;
    BEGIN
    t:=curchr;
    IF(t=30)AND(curgroup<>17)THEN
	{1077}
	BEGIN
	IF curgroup=16 THEN
	    BEGIN
	    Scandelimite(10011,false);
	    printnl(885);
	    BEGIN
	    helpptr:=1;
	    helpline[0]:=886;
	    END;
	    error;
	    END
	ELSE
	    Offsave;
	END
    ELSE
	BEGIN
	p:=newnoad;
	mem[p].hh.b0:=t;
	Scandelimite(p+1,false);
	IF t=29 THEN
	    BEGIN
	    pushnest;
	    newsavelevel(17);
	    mem[curlist.headfield].hh.rh:=p;
	    curlist.tailfield:=p;
	    END
	ELSE
	    BEGIN
	    p:=Finmlist(p);
	    unsave;
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newnoad;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    mem[curlist.tailfield+1].hh.rh:=3;
	    mem[curlist.tailfield+1].hh.lh:=p;
	    END;
	END;
    END;
    {1079}
PROCEDURE Finmath;
    VAR
	l:boolean;
	m:integer;
	p:halfword;
	a:halfword;
	{1082}b:halfword;
	w:scaled;
	z:scaled;
	e:scaled;
	q:scaled;
	d:scaled;
	s:scaled;
	g1,g2:smallnumber;
	r:halfword;
    BEGIN
    m:=curlist.modefield;
    l:=false;
    p:=Finmlist(0);
    IF curlist.modefield=-m THEN
	BEGIN
	curmlist:=p;
	curstyle:=2;
	mlistpenalti:=false;
	mlisttohlist;
	a:=hpack(mem[10003].hh.rh,0,1);
	unsave;
	saveptr:=saveptr-1;
	IF savestack[saveptr+0].int=1 THEN
	    l:=true;
	m:=curlist.modefield;
	p:=Finmlist(0);
	END
    ELSE
	a:=0;
    IF m<0 THEN
	{1080}
	BEGIN
	BEGIN
	mem[curlist.tailfield].hh.rh:=newmath(eqtb[
						   4007].int,0);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	curmlist:=p;
	curstyle:=2;
	mlistpenalti:=true;
	mlisttohlist;
	mem[curlist.tailfield].hh.rh:=mem[10003].hh.rh;
	WHILE mem[curlist.tailfield].hh.rh<>0 DO curlist.tailfield:=mem[curlist.
									tailfield].hh.rh;
	BEGIN
	mem[curlist.tailfield].hh.rh:=newmath(eqtb[4007].int,1);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	curlist.auxfield:=1000;
	unsave;
	END
    ELSE
	BEGIN{1081}
	BEGIN
	getnctoken;
	IF curcmd<>3 THEN
	    BEGIN
	    printnl(887);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=888;
	    helpline[0]:=889;
	    END;
	    backerror;
	    END;
	END;
	{1083}curmlist:=p;
	curstyle:=0;
	mlistpenalti:=false;
	mlisttohlist;
	{1085}
	IF eqtb[2369].hh.rh<>0 THEN
	    BEGIN
	    p:=10003;
	    WHILE mem[p].hh.rh<>0 DO p:=mem[p].hh.rh;
	    mem[p].hh.rh:=newparamglue(7);
	    END;
	IF eqtb[2368].hh.rh=0 THEN
	    p:=mem[10003].hh.rh
	ELSE
	    BEGIN
	    p:=
	    newparamglue(6);
	    mem[p].hh.rh:=mem[10003].hh.rh;
	    END;
	b:=hpack(p,0,1);
	w:=mem[b+1].int;
	z:=eqtb[4020].int;
	s:=eqtb[4021].int;
	IF a=0 THEN
	    BEGIN
	    e:=0;
	    q:=0;
	    END
	ELSE
	    BEGIN
	    e:=mem[a+1].int;
	    q:=e+fontinfo[6+parambase[eqtb[2897].hh.rh]].int;
	    END;
	IF w+q>z THEN
	    {1086}
	    BEGIN
	    IF(e<>0)AND((w-totalshrink[0]+q<=z)OR(
						  totalshrink[1]<>0)OR(totalshrink[2]<>0)OR(totalshrink[3]<>0))THEN
		BEGIN
		freenode(b,7);
		b:=hpack(p,z-q,0);
		END
	    ELSE
		BEGIN
		e:=0;
		IF w>z THEN
		    BEGIN
		    freenode(b,7);
		    b:=hpack(p,z,0);
		    END;
		END;
	    w:=mem[b+1].int;
	    END;
	{1087}d:=half(z-w);
	IF(e>0)AND(d<2*e)THEN
	    BEGIN
	    d:=half(z-w-e);
	    IF p<>0 THEN
		IF mem[p].hh.b0=10 THEN
		    d:=0;
	    END;
	{1088}
	BEGIN
	mem[curlist.tailfield].hh.rh:=newpenalty(eqtb[3594].int);
	curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	END;
	IF(d+s<=eqtb[4019].int)OR l THEN
	    BEGIN
	    g1:=3;
	    g2:=3;
	    END
	ELSE
	    BEGIN
	    g1:=4;
	    g2:=5;
	    END;
	IF l AND(e=0)THEN
	    BEGIN
	    mem[a+4].int:=s;
	    appendtovlis(a);
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newpenalty(10000);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    END
	ELSE
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newparamglue(g1);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	{1089}
	IF e<>0 THEN
	    BEGIN
	    r:=newkern(z-w-e-d);
	    IF l THEN
		BEGIN
		mem[a].hh.rh:=r;
		mem[r].hh.rh:=b;
		b:=a;
		d:=0;
		END
	    ELSE
		BEGIN
		mem[b].hh.rh:=r;
		mem[r].hh.rh:=a;
		END;
	    END;
	mem[b+4].int:=s+d;
	appendtovlis(b);
	{1090}
	IF(a<>0)AND(e=0)AND NOT l THEN
	    BEGIN
	    BEGIN
	    mem[curlist.tailfield].
	    hh.rh:=newpenalty(10000);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    mem[a+4].int:=s+z-mem[a+1].int;
	    appendtovlis(a);
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newpenalty(eqtb[3595].int);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    END
	ELSE
	    BEGIN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newpenalty(eqtb[3595]
						     .int);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newparamglue(g2);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    END;
	Resumeafterd;
	END;
    END;

{1084}PROCEDURE Resumeafterd;
    BEGIN
    IF curgroup<>16 THEN
	confusion(890);
    unsave;
    curlist.alreadyfield:=curlist.alreadyfield+3;
    pushnest;
    curlist.modefield:=93;
    curlist.auxfield:=1000;
    {369}
    BEGIN
    getnctoken;
    IF curcmd<>10 THEN
	backinput;
    END;
    IF nestptr=1 THEN
	Buildpage;
    END;
    {1096}
PROCEDURE Conditional;
    LABEL
	10;
    VAR
	b:boolean;
	r:60..62;
	n:integer;
	c:1..2;
	p,q:halfword;
    BEGIN
    CASE curchr OF
	0:{1100}BEGIN{366}
	    REPEAT
		getnctoken;
	    UNTIL curcmd<>10;
	    IF(curtok>=3328)OR(curcmd=9)THEN
		n:=256
	    ELSE
		BEGIN
		n:=curchr;
		{366}
		REPEAT
		    getnctoken;
		UNTIL curcmd<>10;
		IF(curtok>=3328)OR(curcmd=9)THEN
		    n:=256;
		END;
	    IF n<256 THEN
		b:=(n=curchr)
	    ELSE
		BEGIN
		printnl(904);
		BEGIN
		helpptr:=2;
		helpline[1]:=905;
		helpline[0]:=906;
		END;
		backerror;
		GOTO 10;
		END;
	    END;
	1,2:{1097}BEGIN
	    c:=curchr;
	    IF c=1 THEN
		scanint
	    ELSE
		scandimen(false,false,false);
	    n:=curval;
	    {366}
	    REPEAT
		getnctoken;
	    UNTIL curcmd<>10;
	    IF(curtok>=3132)AND(curtok<=3134)THEN
		r:=curtok-3072
	    ELSE
		BEGIN
		printnl(
			902);
		printcmdchr(55,c);
		BEGIN
		helpptr:=1;
		helpline[0]:=903;
		END;
		backerror;
		r:=61;
		END;
	    IF c=1 THEN
		scanint
	    ELSE
		scandimen(false,false,false);
	    CASE r OF
		60:b:=(n<curval);
		61:b:=(n=curval);
		62:b:=(n>curval);
		END;
	    END;
	3:{1098}BEGIN
	    scaneightbit;
	    b:=NOT Odd(eqtb[3622+curval].int);
	    END;
	4:b:=(Abs(curlist.modefield)=1);
	5:b:=(Abs(curlist.modefield)=93);
	6:b:=(Abs(curlist.modefield)=185);
	7:b:=(curlist.modefield<0);
	8:{1099}BEGIN
	    scaneightbit;
	    b:=(eqtb[2638+curval].hh.rh=0);
	    END;
	9:{1101}BEGIN
	    gettoken;
	    n:=csptr;
	    IF n<>0 THEN
		gettoken;
	    IF csptr<>0 THEN
		BEGIN
		IF curcmd<>eqtb[n].hh.b0 THEN
		    b:=false
		ELSE
		    IF
		    curcmd<94 THEN
			b:=(curchr=eqtb[n].hh.rh)
		    ELSE
			{1102}
			BEGIN
			p:=mem[curcmd].
			hh.rh;
			q:=mem[eqtb[n].hh.rh].hh.rh;
			WHILE(p<>0)AND(q<>0)DO
			    IF mem[p].hh.lh<>mem[q].hh.lh THEN
				p:=0
			    ELSE
				BEGIN
				p:=mem[p].hh.rh;
				q:=mem[q].hh.rh;
				END;
			b:=((p=0)AND(q=0));
			END;
		END
	    ELSE
		BEGIN
		printnl(907);
		BEGIN
		helpptr:=2;
		helpline[1]:=908;
		helpline[0]:=906;
		END;
		backerror;
		GOTO 10;
		END;
	    END;
	END;
    {1103}
    IF b THEN
	BEGIN
	scanleftbrac;
	newsavelevel(5);
	curlevel:=curlevel-1;
	END
    ELSE
	BEGIN
	passblock(0);
	{366}
	REPEAT
	    getnctoken;
	UNTIL curcmd<>10;
	IF curcmd=57 THEN
	    BEGIN
	    scanleftbrac;
	    newsavelevel(6);
	    curlevel:=curlevel-1;
	    END
	ELSE
	    BEGIN
	    printnl(909);
	    BEGIN
	    helpptr:=3;
	    helpline[2]:=910;
	    helpline[1]:=911;
	    helpline[0]:=912;
	    END;
	    backerror;
	    END;
	END;
    10:
    END;
    {1106}
PROCEDURE Spuriouselse;
    BEGIN
    printnl(914);
    BEGIN
    helpptr:=2;
    helpline[1]:=915;
    helpline[0]:=916;
    END;
    error;
    END;
    {1107}
PROCEDURE Caseconditio;
    LABEL
	10,30;
    VAR
	n:integer;
    BEGIN
    scanint;
    n:=curval;
    WHILE n<>0 DO
	BEGIN{366}
	REPEAT
	    getnctoken;
	UNTIL curcmd<>10;
	IF curcmd<>1 THEN
	    IF curcmd=57 THEN
		GOTO 30
	    ELSE
		{1109}
		BEGIN
		printnl(917)
		;
		BEGIN
		helpptr:=3;
		helpline[2]:=918;
		helpline[1]:=919;
		helpline[0]:=912;
		END;
		backerror;
		GOTO 10;
		END;
	passblock(1);
	n:=n-1;
	END;
    30:
    scanleftbrac;
    IF n=0 THEN
	newsavelevel(7)
    ELSE
	newsavelevel(6);
    curlevel:=curlevel-1;
    10:
    END;
    {1113}{1146}
PROCEDURE Newfont;
    LABEL
	10;
    VAR
	u:0..badfontcode;
	s:scaled;
	n:strnumber;
	f:internalfont;
    BEGIN
    IF jobname=0 THEN
	openlogfile;
    scanint;
    IF(curval<0)OR(curval>=badfontcode)THEN
	BEGIN
	printnl(948);
	printint(curval);
	print(949);
	printint(badfontcode-1);
	BEGIN
	helpptr:=1;
	helpline[0]:=951;
	END;
	error;
	curval:=0;
	END;
    u:=curval;
    scanoptional;
    scanfilename;
    {1147}
    IF scankeyword(981)THEN
	BEGIN
	scandimen(false,false,false);
	s:=curval;
	IF(s<=0)OR(s>=134217728)THEN
	    BEGIN
	    printnl(982);
	    printscaled(s);
	    print(983);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=984;
	    helpline[0]:=985;
	    END;
	    error;
	    s:=10*65536;
	    END;
	END
    ELSE
	s:=0;
    {1148}
    IF fontnumber[u]<>0 THEN
	BEGIN
	f:=fontnumber[u];
	IF((s=0)AND(fontsize[f]<>fontdsize[f]))OR((s<>0)AND(s<>fontsize[f]))OR
	    NOT streqstr(fontname[f],curname)OR NOT streqstr(fontarea[f],curarea)
	THEN
	    {1149}
	    BEGIN
	    printnl(561);
	    printint(u);
	    print(986);
	    print(fontname[f]);
	    IF fontsize[f]<>fontdsize[f]THEN
		BEGIN
		print(562);
		printscaled(fontsize[f]);
		print(497);
		END;
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=987;
	    helpline[0]:=988;
	    END;
	    error;
	    END;
	GOTO 10;
	END;
    {1150}
    FOR f:=1 TO fontptr DO
	IF streqstr(fontname[f],curname)AND
	    streqstr(fontarea[f],curarea)AND((s=0)AND(fontsize[f]=fontdsize[f]))OR((
										    s<>0)AND(s=fontsize[f]))THEN
	    BEGIN
	    fontnumber[u]:=f;
	    fontcode[f]:=u;
	    GOTO 10;
	    END;
    readfontinfo(u,curname,curarea,s);
    10:
    END;
    {1154}
PROCEDURE Newinteracti;
    BEGIN
    println;
    interaction:=curchr;
    {72}
    IF interaction=0 THEN
	selector:=16
    ELSE
	selector:=17;
    IF jobname<>0 THEN
	selector:=selector+2;
    END;
    {1133}
PROCEDURE Doregisterco(a:smallnumber);
    LABEL
	10;
    VAR
	p,q,r:halfword;
	n:eightbits;
    BEGIN
    p:=curchr;
    q:=curcmd;
    scaneightbit;
    n:=curval;
    IF q=84 THEN
	scanoptional
    ELSE
	{1134}
	IF NOT scankeyword(974)THEN
	    BEGIN
	    printnl(975);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=976;
	    helpline[0]:=977;
	    END;
	    error;
	    GOTO 10;
	    END;
    aritherror:=false;
    IF q<86 THEN
	{1135}
	CASE p OF
	    0:BEGIN
		scanint;
		IF q=85 THEN
		    curval:=curval+eqtb[3622+n].int;
		END;
	    1:BEGIN
		scandimen(false,false,false);
		IF q=85 THEN
		    curval:=curval+eqtb[4024+n].int;
		END;
	    2:BEGIN
		scanglue(false);
		IF q=85 THEN
		    {1136}
		    BEGIN
		    q:=newspec(curval);
		    r:=eqtb[2379+n].hh.rh;
		    deletegluere(curval);
		    mem[q+1].int:=mem[q+1].int+mem[r+1].int;
		    IF mem[q+2].int=0 THEN
			mem[q].hh.b0:=0;
		    IF mem[q].hh.b0=mem[r].hh.b0 THEN
			mem[q+2].int:=mem[q+2].int+mem[r+2].
			int
		    ELSE
			IF(mem[q].hh.b0<mem[r].hh.b0)AND(mem[r+2].int<>0)THEN
			    BEGIN
			    mem
			    [q+2].int:=mem[r+2].int;
			    mem[q].hh.b0:=mem[r].hh.b0;
			    END;
		    IF mem[q+3].int=0 THEN
			mem[q].hh.b1:=0;
		    IF mem[q].hh.b1=mem[r].hh.b1 THEN
			mem[q+3].int:=mem[q+3].int+mem[r+3].
			int
		    ELSE
			IF(mem[q].hh.b1<mem[r].hh.b1)AND(mem[r+3].int<>0)THEN
			    BEGIN
			    mem
			    [q+3].int:=mem[r+3].int;
			    mem[q].hh.b1:=mem[r].hh.b1;
			    END;
		    curval:=q;
		    END;
		END;
	    END
    ELSE
	{1137}
	BEGIN
	scanint;
	CASE p OF
	    0:IF q=86 THEN
		  curval:=nxplusy(eqtb[3622+n].int,curval,0)
	      ELSE
		  curval:=xovern(eqtb[3622+n].int,curval);
	    1:IF q=86 THEN
		  curval:=nxplusy(eqtb[4024+n].int,curval,0)
	      ELSE
		  curval:=
		  xovern(eqtb[4024+n].int,curval);
	    2:BEGIN
		r:=newspec(eqtb[2379+n].hh.rh);
		IF q=86 THEN
		    BEGIN
		    mem[r+1].int:=nxplusy(mem[eqtb[2379+n].hh.rh+1].int,
					  curval,0);
		    mem[r+2].int:=nxplusy(mem[eqtb[2379+n].hh.rh+2].int,curval,0);
		    mem[r+3].int:=nxplusy(mem[eqtb[2379+n].hh.rh+3].int,curval,0);
		    END
		ELSE
		    BEGIN
		    mem[r+1].int:=xovern(mem[eqtb[2379+n].hh.rh+1].int,curval
					 );
		    mem[r+2].int:=xovern(mem[eqtb[2379+n].hh.rh+2].int,curval);
		    mem[r+3].int:=xovern(mem[eqtb[2379+n].hh.rh+3].int,curval);
		    END;
		curval:=r;
		END;
	    END;
	END;
    IF aritherror THEN
	BEGIN
	printnl(971);
	BEGIN
	helpptr:=2;
	helpline[1]:=972;
	helpline[0]:=973;
	END;
	error;
	GOTO 10;
	END;
    CASE p OF
	0:IF(a>=4)THEN
	      geqworddefin(3622+n,curval)
	  ELSE
	      eqworddefine(
			   3622+n,curval);
	1:IF(a>=4)THEN
	      geqworddefin(4024+n,curval)
	  ELSE
	      eqworddefine(4024+n,
			   curval);
	2:IF(a>=4)THEN
	      geqdefine(2379+n,98,curval)
	  ELSE
	      eqdefine(2379+n,98,curval
		       );
	END;
    10:
    END;
PROCEDURE Prefixedcomm;
    LABEL
	10;
    VAR
	a:smallnumber;
	j:halfword;
	k:0..fontmemsize;
	p,q,r:halfword;
	n:integer;
	e:boolean;
    BEGIN
    a:=0;
    WHILE curcmd=80 DO
	BEGIN
	IF NOT Odd(a DIV curchr)THEN
	    a:=a+curchr;
	{366}
	REPEAT
	    getnctoken;
	UNTIL curcmd<>10;
	IF curcmd<=69 THEN
	    {1114}
	    BEGIN
	    printnl(928);
	    printcmdchr(curcmd,curchr);
	    printchar(39);
	    BEGIN
	    helpptr:=1;
	    helpline[0]:=929;
	    END;
	    backerror;
	    GOTO 10;
	    END;
	END;
    {1115}
    IF(curcmd<>82)AND(a MOD 4<>0)THEN
	BEGIN
	printnl(930);
	printcmdchr(curcmd,curchr);
	printchar(39);
	BEGIN
	helpptr:=1;
	helpline[0]:=931;
	END;
	error;
	END;
    CASE curcmd OF
	{1117}78:BEGIN
	    scanfontnumb;
	    IF(a>=4)THEN
		geqdefine(2894,101,curval)
	    ELSE
		eqdefine(2894,101,curval);
	    END;
	79:BEGIN
	    scanfourbiti;
	    IF(a>=4)THEN
		geqdefine(2943,101,curval)
	    ELSE
		eqdefine(2943,101,curval);
	    END;
	{1118}82:BEGIN
	    IF Odd(curchr)AND NOT(a>=4)THEN
		a:=a+4;
	    e:=(curchr>=2);
	    gettoken;
	    IF curtok<4096 THEN
		{1119}
		BEGIN
		printnl(932);
		BEGIN
		helpptr:=4;
		helpline[3]:=933;
		helpline[2]:=934;
		helpline[1]:=935;
		helpline[0]:=936;
		END;
		backerror;
		END
	    ELSE
		BEGIN
		p:=csptr;
		q:=scantoks(true,e);
		IF(a>=4)THEN
		    geqdefine(p,94+(a MOD 4),defref)
		ELSE
		    eqdefine(p,94+(a MOD 4
				   ),defref);
		END;
	    END;
	{1120}81:BEGIN
	    e:=true;
	    {1121}gettoken;
	    IF csptr<>0 THEN
		BEGIN
		p:=csptr;
		REPEAT
		    gettoken;
		UNTIL(curcmd<>10)AND(curtok<>3133);
		IF curtok>=4096 THEN
		    BEGIN
		    e:=false;
		    IF curcmd>=94 THEN
			mem[curchr].hh.lh:=mem[curchr].hh.lh+1;
		    IF(a>=4)THEN
			geqdefine(p,curcmd,curchr)
		    ELSE
			eqdefine(p,curcmd,curchr);
		    END;
		END;
	    IF e THEN
		BEGIN
		printnl(937);
		BEGIN
		helpptr:=2;
		helpline[1]:=938;
		helpline[0]:=939;
		END;
		backerror;
		END;
	    END;
	{1122}70:BEGIN
	    q:=csptr;
	    p:=curchr;
	    scanoptional;
	    csptr:=q;
	    q:=scantoks(false,false);
	    IF mem[defref].hh.rh=0 THEN
		BEGIN
		IF(a>=4)THEN
		    geqdefine(p,92,0)
		ELSE
		    eqdefine(p,92,0);
		BEGIN
		mem[defref].hh.rh:=avail;
		avail:=defref;
		dynused:=dynused-1;
		END;
		END
	    ELSE
		BEGIN
		IF p=2636 THEN
		    BEGIN
		    mem[q].hh.rh:=getavail;
		    q:=mem[q].hh.rh;
		    mem[q].hh.lh:=637;
		    q:=getavail;
		    mem[q].hh.lh:=379;
		    mem[q].hh.rh:=mem[defref].hh.rh;
		    mem[defref].hh.rh:=q;
		    END;
		IF(a>=4)THEN
		    geqdefine(p,94,defref)
		ELSE
		    eqdefine(p,94,defref);
		END;
	    END;
	{1123}71:BEGIN
	    p:=curchr;
	    scanoptional;
	    scanint;
	    IF(a>=4)THEN
		geqworddefin(3584+p,curval)
	    ELSE
		eqworddefine(3584+p,curval)
		;
	    END;
	72:BEGIN
	    p:=curchr;
	    scanoptional;
	    scandimen(false,false,false);
	    IF(a>=4)THEN
		geqworddefin(4006+p,curval)
	    ELSE
		eqworddefine(4006+p,curval)
		;
	    END;
	73:BEGIN
	    p:=curchr;
	    scanoptional;
	    scanglue(p>=14);
	    IF(mem[curval+1].int=0)AND(mem[curval+2].int=0)AND(mem[curval+3].int=0)
	    THEN
		BEGIN
		mem[0].hh.rh:=mem[0].hh.rh+1;
		deletegluere(curval);
		curval:=0;
		END;
	    IF(a>=4)THEN
		geqdefine(2362+p,98,curval)
	    ELSE
		eqdefine(2362+p,98,curval);
	    END;
	{1124}75:BEGIN
	    scanoptional;
	    scandimen(false,false,false);
	    IF(a>=4)THEN
		geqworddefin(4023,curval)
	    ELSE
		eqworddefine(4023,curval);
	    n:=1;
	    IF scankeyword(940)THEN
		BEGIN
		scanint;
		n:=curval;
		END
	    ELSE
		IF scankeyword(941)THEN
		    BEGIN
		    scanint;
		    n:=-curval;
		    IF n=0 THEN
			eqtb[4023].int:=0;
		    END
		ELSE
		    n:=1;
	    IF(a>=4)THEN
		geqworddefin(3621,n)
	    ELSE
		eqworddefine(3621,n);
	    END;
	{1127}76:BEGIN{1128}
	    IF curchr=2944 THEN
		n:=15
	    ELSE
		IF curchr=3072 THEN
		    n
		    :=32767
		ELSE
		    IF curchr=3456 THEN
			n:=65536
		    ELSE
			IF curchr=3878 THEN
			    n:=
			    16777215
			ELSE
			    n:=127;
	    p:=curchr;
	    scansevenbit;
	    p:=p+curval;
	    scanoptional;
	    scanint;
	    IF((curval<0)AND(p<3878))OR(curval>n)THEN
		BEGIN
		printnl(948);
		printint(curval);
		IF p<3878 THEN
		    print(949)
		ELSE
		    print(950);
		printint(n);
		BEGIN
		helpptr:=1;
		helpline[0]:=951;
		END;
		error;
		curval:=0;
		END;
	    IF p<3878 THEN
		IF(a>=4)THEN
		    geqdefine(p,101,curval)
		ELSE
		    eqdefine(p,101,
			     curval)
	    ELSE
		IF(a>=4)THEN
		    geqworddefin(p,curval)
		ELSE
		    eqworddefine(p,
				 curval);
	    END;
	{1129}77:BEGIN
	    p:=curchr;
	    scanfourbiti;
	    p:=p+curval;
	    scanoptional;
	    scanint;
	    IF(curval>=badfontcode)OR(curval<0)THEN
		n:=0
	    ELSE
		n:=fontnumber[curval];
	    IF n=0 THEN
		BEGIN
		printnl(952);
		printint(curval);
		print(953);
		BEGIN
		helpptr:=1;
		helpline[0]:=954;
		END;
		error;
		END
	    ELSE
		IF(a>=4)THEN
		    geqdefine(p,101,n)
		ELSE
		    eqdefine(p,101,n);
	    END;
	{1132}84,85,86,87:Doregisterco(a);
	{1138}88:BEGIN
	    scaneightbit;
	    IF(a>=4)THEN
		savestack[saveptr+0].int:=1073742080+curval
	    ELSE
		savestack[
			  saveptr+0].int:=1073741824+curval;
	    scanoptional;
	    Scanbox;
	    END;
	{1139}89:BEGIN
	    scanint;
	    n:=curval;
	    IF n<=0 THEN
		p:=0
	    ELSE
		BEGIN
		p:=getnode(2*n+1);
		mem[p].hh.lh:=n;
		FOR j:=1 TO n DO
		    BEGIN
		    scandimen(false,false,false);
		    mem[p+2*j-1].int:=curval;
		    scandimen(false,false,false);
		    mem[p+2*j].int:=curval;
		    END;
		END;
	    IF(a>=4)THEN
		geqdefine(2635,99,p)
	    ELSE
		eqdefine(2635,99,p);
	    END;
	{1143}90:IF curchr=1 THEN
		     BEGIN
		     Newpatterns;
		     GOTO 10;
		     printnl(980);
		     helpptr:=0;
		     error;
		     END
		 ELSE
		     Newhyphexcep;
	{1144}74:BEGIN
	    scantexinfo(true);
	    k:=curval;
	    scanoptional;
	    scandimen(false,false,false);
	    fontinfo[k].int:=curval;
	    END;
	{1145}83:Newfont;
	{1153}91:Newinteracti;
	OTHERS:confusion(927)
	END;
    10:
    END;

{1155}PROCEDURE Doassignment;
    BEGIN{366}
    REPEAT
	getnctoken;
    UNTIL curcmd<>10;
    WHILE curcmd>69 DO
	BEGIN
	Prefixedcomm;
	{366}
	REPEAT
	    getnctoken;
	UNTIL curcmd<>10;
	END;
    END;
    {1159}
PROCEDURE Issuemessage;
    VAR
	oldsetting:0..21;
	c:0..1;
	s:strnumber;
    BEGIN
    c:=curchr;
    mem[10011].hh.rh:=scantoks(false,true);
    oldsetting:=selector;
    selector:=21;
    tokenshow(defref);
    selector:=oldsetting;
    flushlist(defref);
    BEGIN
    IF poolptr+1>poolsize THEN
	overflow(129,poolsize);
    END;
    s:=makestring;
    IF c=0 THEN
	{1160}
	BEGIN
	IF termoffset+(strstart[s+1]-strstart[s])>=
	maxprintline-1 THEN
	    println
	ELSE
	    IF termoffset>0 THEN
		printchar(32);
	print(s);
	Break(termout);
	END
    ELSE
	{1163}
	BEGIN
	printnl(639);
	print(s);
	IF errhelpseen THEN
	    BEGIN
	    helpptr:=1;
	    helpline[0]:=995;
	    END
	ELSE
	    BEGIN
	    helpptr:=4;
	    helpline[3]:=996;
	    helpline[2]:=997;
	    helpline[1]:=998;
	    helpline[0]:=999;
	    END;
	error;
	IF interaction<3 THEN
	    errhelpseen:=true;
	END;
    BEGIN
    strptr:=strptr-1;
    poolptr:=strstart[strptr];
    END;
    END;
    {1167}
PROCEDURE Shiftcase;
    VAR
	b:halfword;
	p:halfword;
	t:halfword;
	c:eightbits;
    BEGIN
    b:=curchr;
    p:=scantoks(false,false);
    p:=mem[defref].hh.rh;
    WHILE p<>0 DO
	BEGIN{1168}
	t:=mem[p].hh.lh;
	IF(t<3328)AND(t>=2816)THEN
	    BEGIN
	    c:=t MOD 256;
	    IF c<128 THEN
		IF eqtb[b+c].hh.rh<>0 THEN
		    mem[p].hh.lh:=256*(t DIV 256)+
		    eqtb[b+c].hh.rh;
	    END;
	p:=mem[p].hh.rh;
	END;
    begintokenli(mem[defref].hh.rh,3);
    BEGIN
    mem[defref].hh.rh:=avail;
    avail:=defref;
    dynused:=dynused-1;
    END;
    END;
    {1172}
PROCEDURE Showwhatever;
    VAR
	p:halfword;
    BEGIN
    CASE curchr OF
	0:{1173}BEGIN
	    gettoken;
	    IF csptr=0 THEN
		BEGIN
		printnl(1011);
		BEGIN
		helpptr:=1;
		helpline[0]:=1012;
		END;
		backerror;
		END
	    ELSE
		BEGIN
		printnl(1013);
		sprintcs(csptr);
		printchar(61);
		printcmdchr(curcmd,curchr);
		IF curcmd>=94 THEN
		    tokenshow(curchr)
		ELSE
		    IF curcmd=93 THEN
			tokenshow(
				  curmark[curchr]);
		IF interaction<3 THEN
		    BEGIN
		    helpptr:=0;
		    errorcount:=errorcount-1;
		    END
		ELSE
		    IF eqtb[3612].int<>0 THEN
			BEGIN
			BEGIN
			helpptr:=3;
			helpline[2]:=1006;
			helpline[1]:=1007;
			helpline[0]:=1008;
			END;
			END
		    ELSE
			BEGIN
			BEGIN
			helpptr:=5;
			helpline[4]:=1006;
			helpline[3]:=1007;
			helpline[2]:=1008;
			helpline[1]:=1009;
			helpline[0]:=1010;
			END;
			END;
		error;
		END;
	    END;
	1:{1175}BEGIN
	    scaneightbit;
	    begindiagnos;
	    printnl(1019);
	    printint(curval);
	    printchar(61);
	    IF eqtb[2638+curval].hh.rh=0 THEN
		print(1020)
	    ELSE
		showbox(eqtb[2638+
			     curval].hh.rh);
	    enddiagnosti(true);
	    printnl(1021);
	    IF interaction<3 THEN
		BEGIN
		helpptr:=0;
		errorcount:=errorcount-1;
		END
	    ELSE
		IF eqtb[3612].int<>0 THEN
		    BEGIN
		    BEGIN
		    helpptr:=3;
		    helpline[2]:=1006;
		    helpline[1]:=1007;
		    helpline[0]:=1008;
		    END;
		    END
		ELSE
		    BEGIN
		    BEGIN
		    helpptr:=5;
		    helpline[4]:=1006;
		    helpline[3]:=1007;
		    helpline[2]:=1008;
		    helpline[1]:=1009;
		    helpline[0]:=1010;
		    END;
		    END;
	    error;
	    END;
	2:{1176}BEGIN
	    p:=thetoks(false);
	    printnl(1013);
	    tokenshow(10003);
	    flushlist(mem[10003].hh.rh);
	    IF interaction<3 THEN
		BEGIN
		helpptr:=0;
		errorcount:=errorcount-1;
		END
	    ELSE
		IF eqtb[3612].int<>0 THEN
		    BEGIN
		    BEGIN
		    helpptr:=3;
		    helpline[2]:=1006;
		    helpline[1]:=1007;
		    helpline[0]:=1008;
		    END;
		    END
		ELSE
		    BEGIN
		    BEGIN
		    helpptr:=5;
		    helpline[4]:=1006;
		    helpline[3]:=1007;
		    helpline[2]:=1008;
		    helpline[1]:=1009;
		    helpline[0]:=1010;
		    END;
		    END;
	    error;
	    END;
	OTHERS:{1177}BEGIN
	    begindiagnos;
	    showactiviti;
	    enddiagnosti(true);
	    printnl(1021);
	    IF interaction<3 THEN
		BEGIN
		helpptr:=0;
		errorcount:=errorcount-1;
		END
	    ELSE
		IF eqtb[3612].int<>0 THEN
		    BEGIN
		    BEGIN
		    helpptr:=3;
		    helpline[2]:=1006;
		    helpline[1]:=1007;
		    helpline[0]:=1008;
		    END;
		    END
		ELSE
		    BEGIN
		    BEGIN
		    helpptr:=5;
		    helpline[4]:=1006;
		    helpline[3]:=1007;
		    helpline[2]:=1008;
		    helpline[1]:=1009;
		    helpline[0]:=1010;
		    END;
		    END;
	    error;
	    END
	END;
    END;

{1181}PROCEDURE Storefmtfile;
    LABEL
	41,42,31,32;
    VAR
	j,k,l:integer;
	p,q:halfword;
	x:integer;
	w:fourquarters;
    BEGIN{1183}
    IF saveptr<>0 THEN
	BEGIN
	printnl(1023);
	BEGIN
	helpptr:=1;
	helpline[0]:=1024;
	END;
	BEGIN
	IF interaction=3 THEN
	    interaction:=2;
	error;
	IF interaction>0 THEN
	    debughelp;
	quit;
	END;
	END;
    {1207}selector:=21;
    print(1034);
    print(jobname);
    printchar(32);
    printint(Abs(eqtb[3606].int)MOD 100);
    printchar(46);
    printint(eqtb[3605].int);
    printchar(46);
    printint(eqtb[3604].int);
    printchar(41);
    IF interaction=0 THEN
	selector:=18
    ELSE
	selector:=19;
    BEGIN
    IF poolptr+1>poolsize THEN
	overflow(129,poolsize);
    END;
    formatident:=makestring;
    packjobname(1035);
    WHILE NOT wopenout(fmtfile)DO promptfilena(1036,1035);
    printnl(1037);
    print(wmakenamestr(fmtfile));
    BEGIN
    strptr:=strptr-1;
    poolptr:=strstart[strptr];
    END;
    print(formatident);
    {1186}
    BEGIN
    fmtfile↑.int:=404035012;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=10000;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=4279;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=1777;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=307;
    Put(fmtfile);
    END;
    {1188}
    BEGIN
    fmtfile↑.int:=poolptr;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=strptr;
    Put(fmtfile);
    END;
    FOR k:=0 TO strptr DO
	BEGIN
	fmtfile↑.int:=strstart[k];
	Put(fmtfile);
	END;
    k:=0;
    WHILE k+4<poolptr DO
	BEGIN
	w.b0:=strpool[k];
	w.b1:=strpool[k+1];
	w.b2:=strpool[k+2];
	w.b3:=strpool[k+3];
	BEGIN
	fmtfile↑.qqqq:=w;
	Put(fmtfile);
	END;
	k:=k+4;
	END;
    k:=poolptr-4;
    w.b0:=strpool[k];
    w.b1:=strpool[k+1];
    w.b2:=strpool[k+2];
    w.b3:=strpool[k+3];
    BEGIN
    fmtfile↑.qqqq:=w;
    Put(fmtfile);
    END;
    println;
    printint(strptr);
    print(1025);
    printint(poolptr);
    {1190}sortavail;
    varused:=0;
    BEGIN
    fmtfile↑.int:=rover;
    Put(fmtfile);
    END;
    p:=0;
    q:=rover;
    x:=0;
    REPEAT
	FOR k:=p TO q+1 DO
	    BEGIN
	    fmtfile↑:=mem[k];
	    Put(fmtfile);
	    END;
	x:=x+q+2-p;
	varused:=varused+q-p;
	p:=q+mem[q].hh.lh;
	q:=mem[q+1].hh.rh;
    UNTIL q=rover;
    varused:=varused+10000-p;
    dynused:=memend-9999;
    BEGIN
    fmtfile↑.int:=memend;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=avail;
    Put(fmtfile);
    END;
    FOR k:=p TO memend DO
	BEGIN
	fmtfile↑:=mem[k];
	Put(fmtfile);
	END;
    x:=x+memend+1-p;
    p:=avail;
    WHILE p<>0 DO
	BEGIN
	dynused:=dynused-1;
	p:=mem[p].hh.rh;
	END;
    BEGIN
    fmtfile↑.int:=varused;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=dynused;
    Put(fmtfile);
    END;
    println;
    printint(x);
    print(1026);
    printint(varused);
    printchar(38);
    printint(dynused);
    {1192}{1194}k:=1;
    REPEAT
	j:=k;
	WHILE j<3583 DO
	    BEGIN
	    IF(eqtb[j].hh.rh=eqtb[j+1].hh.rh)AND(eqtb[j].hh.b0
						 =eqtb[j+1].hh.b0)AND(eqtb[j].hh.b1=eqtb[j+1].hh.b1)THEN
		GOTO 41;
	    j:=j+1;
	    END;
	l:=3584;
	GOTO 31;
    41:
	j:=j+1;
	l:=j;
	WHILE j<3583 DO
	    BEGIN
	    IF(eqtb[j].hh.rh<>eqtb[j+1].hh.rh)OR(eqtb[j].hh.b0
						 <>eqtb[j+1].hh.b0)OR(eqtb[j].hh.b1<>eqtb[j+1].hh.b1)THEN
		GOTO 31;
	    j:=j+1;
	    END;
    31:
	BEGIN
	fmtfile↑.int:=l-k;
	Put(fmtfile);
	END;
	WHILE k<l DO
	    BEGIN
	    BEGIN
	    fmtfile↑:=eqtb[k];
	    Put(fmtfile);
	    END;
	    k:=k+1;
	    END;
	k:=j+1;
	BEGIN
	fmtfile↑.int:=k-l;
	Put(fmtfile);
	END;
    UNTIL k=3584;
    {1195}
    REPEAT
	j:=k;
	WHILE j<4279 DO
	    BEGIN
	    IF eqtb[j].int=eqtb[j+1].int THEN
		GOTO 42;
	    j:=j+1;
	    END;
	l:=4280;
	GOTO 32;
    42:
	j:=j+1;
	l:=j;
	WHILE j<4279 DO
	    BEGIN
	    IF eqtb[j].int<>eqtb[j+1].int THEN
		GOTO 32;
	    j:=j+1;
	    END;
    32:
	BEGIN
	fmtfile↑.int:=l-k;
	Put(fmtfile);
	END;
	WHILE k<l DO
	    BEGIN
	    BEGIN
	    fmtfile↑:=eqtb[k];
	    Put(fmtfile);
	    END;
	    k:=k+1;
	    END;
	k:=j+1;
	BEGIN
	fmtfile↑.int:=k-l;
	Put(fmtfile);
	END;
    UNTIL k>4279;
    BEGIN
    fmtfile↑.int:=parloc;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=sendloc;
    Put(fmtfile);
    END;
    {1197}
    BEGIN
    fmtfile↑.int:=hashused;
    Put(fmtfile);
    END;
    cscount:=2356-hashused;
    FOR p:=257 TO hashused DO
	IF hash[p].rh<>0 THEN
	    BEGIN
	    BEGIN
	    fmtfile↑.int
	    :=p;
	    Put(fmtfile);
	    END;
	    BEGIN
	    fmtfile↑.hh:=hash[p];
	    Put(fmtfile);
	    END;
	    cscount:=cscount+1;
	    END;
    FOR p:=hashused+1 TO 2360 DO
	BEGIN
	fmtfile↑.hh:=hash[p];
	Put(fmtfile);
	END;
    BEGIN
    fmtfile↑.int:=cscount;
    Put(fmtfile);
    END;
    println;
    printint(cscount);
    print(1027);
    {1199}
    BEGIN
    fmtfile↑.int:=fmemptr;
    Put(fmtfile);
    END;
    FOR k:=7 TO fmemptr-1 DO
	BEGIN
	fmtfile↑:=fontinfo[k];
	Put(fmtfile);
	END;
    BEGIN
    fmtfile↑.int:=fontptr;
    Put(fmtfile);
    END;
    FOR k:=1 TO fontptr DO{1201}
	BEGIN
	BEGIN
	fmtfile↑.int:=fontcode[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.qqqq:=fontcheck[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontsize[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontdsize[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontparams[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontname[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontarea[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontbc[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontec[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=charbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=widthbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=heightbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=depthbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=italicbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=ligkernbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=kernbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=extenbase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=parambase[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=fontglue[k];
	Put(fmtfile);
	END;
	printnl(1030);
	printint(fontcode[k]);
	printchar(61);
	printfilenam(fontname[k],fontarea[k],226);
	IF fontsize[k]<>fontdsize[k]THEN
	    BEGIN
	    print(562);
	    printscaled(fontsize[k]);
	    print(497);
	    END;
	END;
    FOR k:=0 TO badfontcode-1 DO
	IF(fontnumber[k]<>0)AND(fontcode[fontnumber
					 [k]]<>k)THEN
	    BEGIN
	    BEGIN
	    fmtfile↑.int:=fontnumber[k];
	    Put(fmtfile);
	    END;
	    BEGIN
	    fmtfile↑.int:=k;
	    Put(fmtfile);
	    END;
	    END;
    BEGIN
    fmtfile↑.int:=0;
    Put(fmtfile);
    END;
    println;
    printint(fmemptr-7);
    print(1028);
    printint(fontptr-0);
    print(1029);
    IF fontptr<>1 THEN
	printchar(115);
    {1203}
    BEGIN
    fmtfile↑.int:=hyphcount;
    Put(fmtfile);
    END;
    FOR k:=0 TO 307 DO
	IF hyphword[k]<>0 THEN
	    BEGIN
	    BEGIN
	    fmtfile↑.int:=k;
	    Put(fmtfile);
	    END;
	    BEGIN
	    fmtfile↑.int:=hyphword[k];
	    Put(fmtfile);
	    END;
	    BEGIN
	    fmtfile↑.int:=hyphlist[k];
	    Put(fmtfile);
	    END;
	    END;
    BEGIN
    fmtfile↑.int:=triemax;
    Put(fmtfile);
    END;
    FOR k:=0 TO triemax DO
	BEGIN
	fmtfile↑.hh:=trie[k];
	Put(fmtfile);
	END;
    BEGIN
    fmtfile↑.int:=trieopptr;
    Put(fmtfile);
    END;
    FOR k:=1 TO trieopptr DO
	BEGIN
	BEGIN
	fmtfile↑.int:=hyfdistance[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=hyfnum[k];
	Put(fmtfile);
	END;
	BEGIN
	fmtfile↑.int:=hyfnext[k];
	Put(fmtfile);
	END;
	END;
    println;
    printint(hyphcount);
    print(1031);
    IF hyphcount<>1 THEN
	printchar(115);
    printnl(1032);
    printint(triemax);
    print(579);
    printint(trieopptr);
    print(1033);
    IF trieopptr<>1 THEN
	printchar(115);
    {1205}
    BEGIN
    fmtfile↑.int:=interaction;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=formatident;
    Put(fmtfile);
    END;
    BEGIN
    fmtfile↑.int:=69069;
    Put(fmtfile);
    END;
    wclose(fmtfile);
    eqtb[3614].int:=0;
    END;

{1227}{1228}PROCEDURE Newwhatsit(s:smallnumber;
		     w:smallnumber);
    VAR
	p:halfword;
    BEGIN
    p:=getnode(w);
    mem[p].hh.b0:=8;
    mem[p].hh.b1:=s;
    mem[curlist.tailfield].hh.rh:=p;
    curlist.tailfield:=p;
    END;
    {1229}
PROCEDURE Newsendwhats(w:smallnumber);
    VAR
	p:halfword;
    BEGIN
    Newwhatsit(curchr,w);
    scanfourbiti;
    mem[curlist.tailfield+1].hh.lh:=curval;
    END;
PROCEDURE Doextension;
    VAR
	i,j,k:integer;
	p,q,r:halfword;
    BEGIN
    CASE curchr OF
	0:{1230}BEGIN
	    Newsendwhats(3);
	    scanoptional;
	    scanfilename;
	    mem[curlist.tailfield+1].hh.rh:=curname;
	    mem[curlist.tailfield+2].hh.lh:=curarea;
	    mem[curlist.tailfield+2].hh.rh:=curext;
	    END;
	1:{1231}BEGIN
	    k:=csptr;
	    Newsendwhats(2);
	    csptr:=k;
	    p:=scantoks(false,false);
	    mem[curlist.tailfield+1].hh.rh:=defref;
	    END;
	2:{1232}BEGIN
	    Newsendwhats(2);
	    mem[curlist.tailfield+1].hh.rh:=0;
	    END;
	3:{1233}BEGIN
	    Newwhatsit(3,2);
	    mem[curlist.tailfield+1].hh.lh:=0;
	    p:=scantoks(false,true);
	    mem[curlist.tailfield+1].hh.rh:=defref;
	    END;
	OTHERS:confusion(1054)
	END;
    END;
    {957}
PROCEDURE Handlerightb;
    LABEL
	30,10;
    VAR
	p:halfword;
    BEGIN
    CASE curgroup OF
	1:unsave;
	0:BEGIN
	    printnl(773);
	    BEGIN
	    helpptr:=2;
	    helpline[1]:=774;
	    helpline[0]:=775;
	    END;
	    error;
	    END;
	15,16,17:Extrarightbr;
	{974}2:Package(0);
	3:BEGIN
	    Endgraf;
	    Package(0);
	    END;
	4:BEGIN
	    Endgraf;
	    Package(4);
	    END;
	{989}13:BEGIN
	    Endgraf;
	    unsave;
	    saveptr:=saveptr-1;
	    IF curlist.headfield<>curlist.tailfield THEN
		BEGIN
		p:=vpackage(mem[
				curlist.headfield].hh.rh,0,1,1073741823);
		popnest;
		IF savestack[saveptr+0].int<255 THEN
		    BEGIN
		    BEGIN
		    mem[curlist.tailfield].
		    hh.rh:=getnode(3);
		    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
		    END;
		    mem[curlist.tailfield].hh.b0:=3;
		    mem[curlist.tailfield].hh.b1:=savestack[saveptr+0].int;
		    mem[curlist.tailfield+1].int:=mem[p+3].int+mem[p+2].int;
		    mem[curlist.tailfield+2].int:=mem[p+5].hh.rh;
		    END
		ELSE
		    BEGIN
		    BEGIN
		    mem[curlist.tailfield].hh.rh:=getnode(2);
		    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
		    END;
		    mem[curlist.tailfield].hh.b0:=5;
		    mem[curlist.tailfield].hh.b1:=0;
		    mem[curlist.tailfield+1].int:=mem[p+5].hh.rh;
		    END;
		freenode(p,7);
		END;
	    {369}
	    BEGIN
	    getnctoken;
	    IF curcmd<>10 THEN
		backinput;
	    END;
	    END;
	10:{912}BEGIN
	    IF curinput.locfield<>0 THEN
		confusion(256);
	    endtokenlist;
	    Endgraf;
	    unsave;
	    outputactive:=false;
	    {913}
	    IF eqtb[2893].hh.rh<>0 THEN
		BEGIN
		printnl(732);
		BEGIN
		helpptr:=3;
		helpline[2]:=733;
		helpline[1]:=734;
		helpline[0]:=735;
		END;
		error;
		flushnodelis(eqtb[2893].hh.rh);
		eqtb[2893].hh.rh:=0;
		END;
	    IF curlist.tailfield<>curlist.headfield THEN
		BEGIN
		mem[pagetail].hh.rh:=
		mem[curlist.headfield].hh.rh;
		pagetail:=curlist.tailfield;
		END;
	    IF mem[10002].hh.rh<>0 THEN
		BEGIN
		IF mem[10001].hh.rh=0 THEN
		    nest[0].
		    tailfield:=pagetail;
		mem[pagetail].hh.rh:=mem[10001].hh.rh;
		mem[10001].hh.rh:=mem[10002].hh.rh;
		mem[10002].hh.rh:=0;
		pagetail:=10002;
		END;
	    popnest;
	    Buildpage;
	    END;
	{1007}12:Builddiscret;
	{1025}9:BEGIN
	    Endgraf;
	    unsave;
	    Alignpeek;
	    END;
	{1056}14:BEGIN
	    Endgraf;
	    unsave;
	    saveptr:=saveptr-2;
	    p:=vpackage(mem[curlist.headfield].hh.rh,savestack[saveptr+1].int,
			savestack[saveptr+0].int,1073741823);
	    popnest;
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newnoad;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    mem[curlist.tailfield].hh.b0:=28;
	    mem[curlist.tailfield+1].hh.rh:=2;
	    mem[curlist.tailfield+1].hh.lh:=p;
	    END;
	{1072}11:BEGIN
	    unsave;
	    saveptr:=saveptr-1;
	    mem[savestack[saveptr+0].int].hh.rh:=3;
	    mem[savestack[saveptr+0].int].hh.lh:=Finmlist(0);
	    END;
	{1104}5:BEGIN
	    leavetranspa;
	    {366}
	    REPEAT
		getnctoken;
	    UNTIL curcmd<>10;
	    IF curcmd=57 THEN
		passblock(0)
	    ELSE
		BEGIN
		printnl(909);
		BEGIN
		helpptr:=3;
		helpline[2]:=913;
		helpline[1]:=911;
		helpline[0]:=912;
		END;
		backerror;
		END;
	    END;
	6:BEGIN
	    leavetranspa;
	    {369}
	    BEGIN
	    getnctoken;
	    IF curcmd<>10 THEN
		backinput;
	    END;
	    END;
	{1108}7:BEGIN
	    leavetranspa;
	    WHILE true DO
		BEGIN{366}
		REPEAT
		    getnctoken;
		UNTIL curcmd<>10;
		IF curcmd=1 THEN
		    passblock(1)
		ELSE
		    IF curcmd=57 THEN
			GOTO 30
		    ELSE
			{1109}
			BEGIN
			printnl(917);
			BEGIN
			helpptr:=3;
			helpline[2]:=918;
			helpline[1]:=919;
			helpline[0]:=912;
			END;
			backerror;
			GOTO 10;
			END;
		END;
    30:
	    passblock(0);
	    END;
	OTHERS:confusion(776)
	END;
    10:
    END;

PROCEDURE Maincontrol;
    LABEL
	60,21,70,71,72,73,74,10;
    VAR
	t:integer;
	{917}l:quarterword;
	c:eightbits;
	f:internalfont;
	r:halfword;
	p:halfword;
	k:0..fontmemsize;
	q:halfword;
	i:fourquarters;
	j:fourquarters;
	s:integer;
	ligaturepres:boolean;
    BEGIN
    60:
    getnctoken;
    21:{916}
    IF interrupt>0 THEN
	IF oktointerrup THEN
	    BEGIN
	    backinput;
	    pauseforinst;
	    GOTO 60;
	    END;
    IF panicking THEN
	checkmem(false);
    IF eqtb[3617].int<>0 THEN
	BEGIN
	begindiagnos;
	printnl(123);
	IF curlist.modefield<>shownmode THEN
	    BEGIN
	    printmode(curlist.modefield);
	    print(553);
	    shownmode:=curlist.modefield;
	    END;
	printcmdchr(curcmd,curchr);
	printchar(125);
	enddiagnosti(false);
	END;
    CASE Abs(curlist.modefield)+curcmd OF
	104,105:GOTO 70;
	109:BEGIN
	    scancharnum;
	    curchr:=curval;
	    GOTO 70;
	    END;
	103:IF curlist.auxfield=1000 THEN
		GOTO 74
	    ELSE
		Appspace;
	156,248:GOTO 74;
	{931}1,93,185,11,14,195:;
	40,132,224:BEGIN{366}
	    REPEAT
		getnctoken;
	    UNTIL curcmd<>10;
	    GOTO 21;
	    END;
	20:startinput;
	15:IF Itsallover THEN
	       GOTO 10;
	    {934}112,204,{944}36,129,221,{962}24,115,207,{980}226,{987}39,223,{1000}
	209,43,{1014}228,{1022}34,125,218,{1034}47,139,7,99,191:Reportillega;
	    {932}8,100,9,101,18,110,49,141,16,108,48,140,51,143,65,157,52,144,54,146
	,53,145,31,123,50,142,29,121,45,137,194,198,199,212:BEGIN
	    Insertdollar;
	    GOTO 21;
	    END;
	{943}37,128,220:BEGIN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=scanrulespec;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    IF Abs(curlist.modefield)=1 THEN
		curlist.auxfield:=-65536000;
	    END;
	{945}28,119,211,213:Appendglue;
	30,122,214,215:Appendkern;
	{951}2,94:newsavelevel(1);
	61,153,245:newsavelevel(15);
	62,154,246:IF curgroup=15 THEN
		       unsave
		   ELSE
		       Offsave;
	{956}3,95,187:Handlerightb;
	{961}23,116,208:BEGIN
	    t:=curchr;
	    scandimen(false,false,false);
	    IF t=0 THEN
		savestack[saveptr+0].int:=curval
	    ELSE
		savestack[saveptr+0].
		int:=-curval;
	    Scanbox;
	    END;
	32,124,216:BEGIN
	    savestack[saveptr+0].int:=1073742237+curchr;
	    Scanbox;
	    END;
	22,114,206:BEGIN
	    savestack[saveptr+0].int:=0;
	    Beginbox;
	    END;
	{979}42:Newgraf(curchr>0);
	12,13,17,4,67,66,44,46,27,64,68:BEGIN
	    backinput;
	    Newgraf(true);
	    END;
	{982}134:Indentinhmod;
	{984}106:BEGIN
	    Endgraf;
	    IF curlist.modefield=1 THEN
		Buildpage;
	    END;
	107,120:BEGIN
	    backinput;
	    curtok:=partoken;
	    csptr:=parloc;
	    curcmd:=eqtb[csptr].hh.b0;
	    curchr:=eqtb[csptr].hh.rh;
	    GOTO 21;
	    END;
	{986}38,130,222,131:Begininserto;
	19,111,203:Makemark;
	{991}70,162,254:Changeaux;
	{993}41,133,225:Appendpenalt;
	{995}26,118,210:Deleteskip;
	{998}25,117:Unpackage;
	{1001}135:Appenditalic;
	227:BEGIN
	    mem[curlist.tailfield].hh.rh:=newkern(0);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	{1005}138,230:Appenddiscre;
	{1011}159,251:BEGIN
	    mem[10011].hh.rh:=thetoks(curchr>0);
	    begintokenli(mem[10003].hh.rh,3);
	    END;
	158,250:BEGIN
	    mem[10011].hh.rh:=numtoks;
	    begintokenli(mem[10003].hh.rh,3);
	    END;
	160,252,161,253:Insthe;
	{1013}136:Makeaccent;
	{1018}6,98,190,5,97,189:BEGIN
	    Alignerror;
	    GOTO 21;
	    END;
	35,127,219:Noalignerror;
	63,155,247:Omiterror;
	{1023}33,126:Initalign;
	217:IF Privileged THEN
		IF curgroup=16 THEN
		    Initalign
		ELSE
		    Offsave;
	10,102:Doendv;
	{1026}96:Initmath;
	{1030}231:IF Privileged THEN
		      Starteqno;
	{1040}186:BEGIN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newnoad;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    backinput;
	    Scanmath(curlist.tailfield+1);
	    END;
	{1043}196,197:Setmathchar(eqtb[3072+curchr].hh.rh);
	201:BEGIN
	    scancharnum;
	    Setmathchar(curval+28672);
	    END;
	202:BEGIN
	    scanfifteenb;
	    Setmathchar(curval);
	    END;
	200:BEGIN
	    scantwentyse;
	    Setmathchar(curval DIV 4096);
	    END;
	{1047}233:BEGIN
	    BEGIN
	    mem[curlist.tailfield].hh.rh:=newnoad;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	    mem[curlist.tailfield].hh.b0:=curchr;
	    Scanmath(curlist.tailfield+1);
	    END;
	234:Mathlimitswi;
	{1051}249:Mathradical;
	{1053}229:Mathac;
	{1055}238:BEGIN
	    scanspec;
	    newsavelevel(14);
	    pushnest;
	    curlist.modefield:=-1;
	    curlist.auxfield:=-65536000;
	    END;
	{1059}236:BEGIN
	    mem[curlist.tailfield].hh.rh:=newstyle(curchr);
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
	237:Mathnonscrip;
	{1061}193,192:Subsup;
	{1066}235:Mathfraction;
	{1075}232:Mathleftrigh;
	{1078}188:IF curgroup=16 THEN
		      Finmath
		  ELSE
		      Offsave;
	{1095}56,148,240:Conditional;
	{1105}57,149,241:Caseconditio;
	58,150,242:Spuriouselse;
	    {1112}71,163,255,72,164,256,73,165,257,74,166,258,75,167,259,76,168,260,
	77,169,261,78,170,262,79,171,263,80,172,264,81,173,265,82,174,266,83,175
	,267,84,176,268,85,177,269,86,178,270,87,179,271,88,180,272,89,181,273,
	90,182,274,91,183,275,92,184,276:Prefixedcomm;
	{1156}59,151,243:Issuemessage;
	{1164}55,147,239:Shiftcase;
	{1169}21,113,205:Showwhatever;
	{1226}60,152,244:Doextension;
	END;
    GOTO 60;
    70:{918}
    f:=eqtb[2894].hh.rh;
    IF f=0 THEN
	BEGIN
	Missingfont;
	GOTO 60;
	END;
    c:=curchr;
    71:
    IF(c<fontbc[f])OR(c>fontec[f])THEN
	BEGIN
	charwarning(f,c);
	GOTO 60;
	END;
    72:
    q:=curlist.tailfield;
    ligaturepres:=false;
    l:=c;
    73:{920}
    IF c<128 THEN
	BEGIN
	s:=eqtb[3456+c].hh.rh;
	IF s=1000 THEN
	    curlist.auxfield:=1000
	ELSE
	    IF s<1000 THEN
		BEGIN
		IF s>0
		THEN
		    curlist.auxfield:=s;
		END
	    ELSE
		IF curlist.auxfield<1000 THEN
		    curlist.auxfield:=1000
		ELSE
		    curlist.auxfield:=s;
	END
    ELSE
	curlist.auxfield:=1000;
    {921}i:=fontinfo[charbase[f]+l].qqqq;
    IF(i.b0>0)THEN
	BEGIN
	p:=avail;
	IF p=0 THEN
	    p:=getavail
	ELSE
	    BEGIN
	    avail:=mem[p].hh.rh;
	    mem[p].hh.rh:=0;
	    dynused:=dynused+1;
	    END;
	mem[p].hh.b0:=f;
	mem[p].hh.b1:=c;
	mem[curlist.tailfield].hh.rh:=p;
	curlist.tailfield:=p;
	END
    ELSE
	charwarning(f,l);
    {922}getnext;
    IF(curcmd=11)OR(curcmd=12)THEN
	r:=curchr
    ELSE
	BEGIN
	nctoken;
	IF curcmd=16 THEN
	    BEGIN
	    scancharnum;
	    r:=curval;
	    END
	ELSE
	    r:=256;
	END;
    IF((i.b2 MOD 4)=1)AND(r<>256)THEN
	{923}
	BEGIN
	k:=ligkernbase[f]+i.b3;
	REPEAT
	    j:=fontinfo[k].qqqq;
	    IF j.b1=r THEN
		IF j.b2<128 THEN
		    {926}
		    BEGIN
		    ligaturepres:=true;
		    l:=j.b3;
		    c:=r;
		    GOTO 73;
		    END
		ELSE
		    {924}
		    BEGIN{925}
		    IF ligaturepres THEN
			BEGIN
			p:=newligature(f,l,mem
				       [q].hh.rh);
			mem[q].hh.rh:=p;
			curlist.tailfield:=p;
			END;
		    IF c=45 THEN
			IF curlist.modefield=93 THEN
			    BEGIN
			    mem[curlist.tailfield].
			    hh.rh:=newdisc;
			    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
			    END;
		    BEGIN
		    mem[curlist.tailfield].hh.rh:=newkern(fontinfo[kernbase[f]+j.b3].
							  int);
		    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
		    END;
		    c:=r;
		    GOTO 72;
		    END;
	    k:=k+1;
	UNTIL j.b0>=128;
	END;
    {925}
    IF ligaturepres THEN
	BEGIN
	p:=newligature(f,l,mem[q].hh.rh);
	mem[q].hh.rh:=p;
	curlist.tailfield:=p;
	END;
    IF c=45 THEN
	IF curlist.modefield=93 THEN
	    BEGIN
	    mem[curlist.tailfield].
	    hh.rh:=newdisc;
	    curlist.tailfield:=mem[curlist.tailfield].hh.rh;
	    END;
    IF r=256 THEN
	GOTO 21;
    c:=r;
    GOTO 71;
    74:{927}
    IF eqtb[2373].hh.rh=0 THEN
	BEGIN{928}
	BEGIN
	p:=fontglue[eqtb[2894
			 ].hh.rh];
	IF p=0 THEN
	    BEGIN
	    f:=eqtb[2894].hh.rh;
	    p:=newspec(0);
	    k:=parambase[f]+2;
	    mem[p+1].int:=fontinfo[k].int;
	    mem[p+2].int:=fontinfo[k+1].int;
	    mem[p+3].int:=fontinfo[k+2].int;
	    fontglue[f]:=p;
	    END;
	END;
	q:=newglue(p);
	END
    ELSE
	q:=newparamglue(11);
    mem[curlist.tailfield].hh.rh:=q;
    curlist.tailfield:=q;
    GOTO 60;
    10:
    END;
{1182}{443}FUNCTION Openfmtfile:boolean;
    LABEL
	40,10;
    VAR
	j:0..bufsize;
    BEGIN
    IF buffer[curinput.locfield]=33 THEN
	BEGIN
	curinput.locfield:=
	curinput.locfield+1;
	j:=curinput.locfield;
	buffer[Last]:=32;
	WHILE buffer[j]<>32 DO j:=j+1;
	packbuffered(0,curinput.locfield,j-1);
	IF wopenin(fmtfile)THEN
	    BEGIN
	    curinput.locfield:=j;
	    GOTO 40;
	    END;
	packbuffered(9,curinput.locfield,j-1);
	IF wopenin(fmtfile)THEN
	    BEGIN
	    curinput.locfield:=j;
	    GOTO 40;
	    END;
	Writeln(termout,'Sorry, I can''t find that format; will try BASIC.');
	END;
    packbuffered(14,1,0);
    IF NOT wopenin(fmtfile)THEN
	BEGIN
	Writeln(termout,
		'I can''t find the BASIC format file!');
	Openfmtfile:=false;
	GOTO 10;
	END;
    40:
    Openfmtfile:=true;
    10:
    END;

FUNCTION Loadfmtfile:boolean;
    LABEL
	6666,10;
    VAR
	j,k:integer;
	p,q:halfword;
	x,y:integer;
	w:fourquarters;
    BEGIN{1187}
    x:=fmtfile↑.int;
    IF x<>404035012 THEN
	GOTO 6666;
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<>10000 THEN
	GOTO 6666;
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<>4279 THEN
	GOTO 6666;
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<>1777 THEN
	GOTO 6666;
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<>307 THEN
	GOTO 6666;
    {1189}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<0 THEN
	GOTO 6666;
    IF x>poolsize THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'string pool size');
	GOTO 6666;
	END
    ELSE
	poolptr:=x;
    END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<0 THEN
	GOTO 6666;
    IF x>maxstrings THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'max strings');
	GOTO 6666;
	END
    ELSE
	strptr:=x;
    END;
    FOR k:=0 TO strptr DO
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>poolptr)THEN
	    GOTO 6666
	ELSE
	    strstart[k]:=x;
	END;
    k:=0;
    WHILE k+4<poolptr DO
	BEGIN
	BEGIN
	Get(fmtfile);
	w:=fmtfile↑.qqqq;
	END;
	strpool[k]:=w.b0;
	strpool[k+1]:=w.b1;
	strpool[k+2]:=w.b2;
	strpool[k+3]:=w.b3;
	k:=k+4;
	END;
    k:=poolptr-4;
    BEGIN
    Get(fmtfile);
    w:=fmtfile↑.qqqq;
    END;
    strpool[k]:=w.b0;
    strpool[k+1]:=w.b1;
    strpool[k+2]:=w.b2;
    strpool[k+3]:=w.b3;
    {1191}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>10000)THEN
	GOTO 6666
    ELSE
	rover:=x;
    END;
    p:=0;
    q:=rover;
    x:=0;
    REPEAT
	FOR k:=p TO q+1 DO
	    BEGIN
	    Get(fmtfile);
	    mem[k]:=fmtfile↑;
	    END;
	p:=q+mem[q].hh.lh;
	IF(p>10000)OR((q>=mem[q+1].hh.rh)AND(mem[q+1].hh.rh<>rover))THEN
	    GOTO
	    6666;
	q:=mem[q+1].hh.rh;
    UNTIL q=rover;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<10000 THEN
	GOTO 6666;
    IF x>memmax THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'mem max');
	GOTO 6666;
	END
    ELSE
	memend:=x;
    END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>memend)THEN
	GOTO 6666
    ELSE
	avail:=x;
    END;
    FOR k:=p TO memend DO
	BEGIN
	Get(fmtfile);
	mem[k]:=fmtfile↑;
	END;
    BEGIN
    Get(fmtfile);
    varused:=fmtfile↑.int;
    END;
    BEGIN
    Get(fmtfile);
    dynused:=fmtfile↑.int;
    END;
    maxvarused:=varused;
    {1193}{1196}k:=1;
    REPEAT
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<1)OR(k+x>4279)THEN
	    GOTO 6666;
	FOR j:=k TO k+x-1 DO
	    BEGIN
	    Get(fmtfile);
	    eqtb[j]:=fmtfile↑;
	    END;
	k:=k+x;
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(k+x>4280)THEN
	    GOTO 6666;
	FOR j:=k TO k+x-1 DO eqtb[j]:=eqtb[k-1];
	k:=k+x;
    UNTIL k>4279;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<257)OR(x>2357)THEN
	GOTO 6666
    ELSE
	parloc:=x;
    END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<257)OR(x>2357)THEN
	GOTO 6666
    ELSE
	sendloc:=x;
    END;
    {1198}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<257)OR(x>2357)THEN
	GOTO 6666
    ELSE
	hashused:=x;
    END;
    p:=256;
    REPEAT
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<p+1)OR(x>hashused)THEN
	    GOTO 6666
	ELSE
	    p:=x;
	END;
	BEGIN
	Get(fmtfile);
	hash[p]:=fmtfile↑.hh;
	END;
    UNTIL p=hashused;
    FOR p:=hashused+1 TO 2360 DO
	BEGIN
	Get(fmtfile);
	hash[p]:=fmtfile↑.hh;
	END;
    BEGIN
    Get(fmtfile);
    cscount:=fmtfile↑.int;
    END;
    {1200}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<7 THEN
	GOTO 6666;
    IF x>fontmemsize THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'font mem size');
	GOTO 6666;
	END
    ELSE
	fmemptr:=x;
    END;
    FOR k:=7 TO fmemptr-1 DO
	BEGIN
	Get(fmtfile);
	fontinfo[k]:=fmtfile↑;
	END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<0 THEN
	GOTO 6666;
    IF x>fontmax THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'font max');
	GOTO 6666;
	END
    ELSE
	fontptr:=x;
    END;
    FOR k:=1 TO fontptr DO{1202}
	BEGIN
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>badfontcode)THEN
	    GOTO 6666
	ELSE
	    fontcode[k]:=x;
	END;
	fontnumber[fontcode[k]]:=k;
	BEGIN
	Get(fmtfile);
	fontcheck[k]:=fmtfile↑.qqqq;
	END;
	BEGIN
	Get(fmtfile);
	fontsize[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	fontdsize[k]:=fmtfile↑.int;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>65535)THEN
	    GOTO 6666
	ELSE
	    fontparams[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>strptr)THEN
	    GOTO 6666
	ELSE
	    fontname[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>strptr)THEN
	    GOTO 6666
	ELSE
	    fontarea[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>255)THEN
	    GOTO 6666
	ELSE
	    fontbc[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>255)THEN
	    GOTO 6666
	ELSE
	    fontec[k]:=x;
	END;
	BEGIN
	Get(fmtfile);
	charbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	widthbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	heightbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	depthbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	italicbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	ligkernbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	kernbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	extenbase[k]:=fmtfile↑.int;
	END;
	BEGIN
	Get(fmtfile);
	parambase[k]:=fmtfile↑.int;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>10000)THEN
	    GOTO 6666
	ELSE
	    fontglue[k]:=x;
	END;
	END;
    REPEAT
	BEGIN
	Get(fmtfile);
	y:=fmtfile↑.int;
	END;
	IF Eof(fmtfile)THEN
	    GOTO 6666;
	IF y<>0 THEN
	    BEGIN
	    IF(y<0)OR(y>=fontptr)THEN
		GOTO 6666;
	    BEGIN
	    BEGIN
	    Get(fmtfile);
	    x:=fmtfile↑.int;
	    END;
	    IF(x<0)OR(x>badfontcode)THEN
		GOTO 6666
	    ELSE
		k:=x;
	    END;
	    fontnumber[k]:=y;
	    END;
    UNTIL y=0;
    {1204}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>307)THEN
	GOTO 6666
    ELSE
	hyphcount:=x;
    END;
    FOR k:=1 TO hyphcount DO
	BEGIN
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>307)THEN
	    GOTO 6666
	ELSE
	    j:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>strptr)THEN
	    GOTO 6666
	ELSE
	    hyphword[j]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>65535)THEN
	    GOTO 6666
	ELSE
	    hyphlist[j]:=x;
	END;
	END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF x<0 THEN
	GOTO 6666;
    IF x>triesize THEN
	BEGIN
	Writeln(termout,'---! Must increase the ',
		'trie size');
	GOTO 6666;
	END
    ELSE
	triemax:=x;
    END;
    FOR k:=0 TO triemax DO
	BEGIN
	Get(fmtfile);
	trie[k]:=fmtfile↑.hh;
	END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>255)THEN
	GOTO 6666
    ELSE
	trieopptr:=x;
    END;
    FOR k:=1 TO trieopptr DO
	BEGIN
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>63)THEN
	    GOTO 6666
	ELSE
	    hyfdistance[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>63)THEN
	    GOTO 6666
	ELSE
	    hyfnum[k]:=x;
	END;
	BEGIN
	BEGIN
	Get(fmtfile);
	x:=fmtfile↑.int;
	END;
	IF(x<0)OR(x>255)THEN
	    GOTO 6666
	ELSE
	    hyfnext[k]:=x;
	END;
	END;
    {1206}
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>3)THEN
	GOTO 6666
    ELSE
	interaction:=x;
    END;
    BEGIN
    BEGIN
    Get(fmtfile);
    x:=fmtfile↑.int;
    END;
    IF(x<0)OR(x>strptr)THEN
	GOTO 6666
    ELSE
	formatident:=x;
    END;
    BEGIN
    Get(fmtfile);x:=fmtfile↑.int;
    END;
    IF(x<>69069)OR Eof(fmtfile)THEN
	GOTO 6666;
    Loadfmtfile:=true;GOTO 10;
    6666:
    Writeln(termout,'(Fatal format file error; I''m stymied)');
    Loadfmtfile:=false;10:
    END;

{1208}{1212}PROCEDURE Closefilesan;
    VAR
	k:integer;
    BEGIN{1245}
    FOR k:=0 TO 15 DO
	IF sendopen[k]THEN
	    aclose(sendfile[k]);
    IF eqtb[3614].int<>0 THEN
	{1213}
	BEGIN
	printnl(1039);
	println;
	printint(strptr);
	print(1025);
	printint(poolptr);
	printnl(1038);
	printint(maxstrings);
	printchar(32);
	printint(poolsize);
	printnl(1040);
	printint(maxvarused);
	printchar(38);
	printint(memend-9999);
	printnl(1038);
	printint(10000);
	printchar(38);
	printint(memmax-9999);
	println;
	printint(cscount);
	print(1027);
	printnl(1038);
	printint(2100);
	println;
	printint(fmemptr);
	print(1028);
	printint(fontptr-0);
	print(1041);
	IF fontptr<>1 THEN
	    printchar(115);
	printnl(1038);
	printint(fontmemsize);
	printchar(32);
	printint(fontmax-0);
	println;
	printint(hyphcount);
	print(1031);
	IF hyphcount<>1 THEN
	    printchar(115);
	printnl(1038);
	printint(307);
	printnl(1042);
	printint(maxinstack);
	print(1043);
	printint(maxneststack);
	print(1044);
	printint(maxparamstac);
	print(1045);
	printint(maxbufstack+1);
	print(1046);
	printint(maxsavestack+6);
	printchar(115);
	printnl(1038);
	printint(stacksize);
	print(1043);
	printint(nestsize);
	print(1044);
	printint(paramsize);
	print(1045);
	printint(bufsize);
	print(1046);
	printint(savesize);
	printchar(115);
	END;
    {554}
    IF totalpages=0 THEN
	printnl(591)
    ELSE
	BEGIN
	BEGIN
	dvibuf[dviptr]:=
	243;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	dvifour(lastbop);
	lastbop:=dvioffset+dviptr-5;
	dvifour(25400000);
	dvifour(473628672);
	preparemag;
	dvifour(eqtb[3600].int);
	dvifour(maxv);
	dvifour(maxh);
	BEGIN
	dvibuf[dviptr]:=maxpush DIV 256;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	BEGIN
	dvibuf[dviptr]:=maxpush MOD 256;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	BEGIN
	dvibuf[dviptr]:=totalpages DIV 256;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	BEGIN
	dvibuf[dviptr]:=totalpages MOD 256;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	{555}
	WHILE fontptr>0 DO
	    BEGIN
	    IF fontused[fontptr]THEN
		BEGIN
		dvifour(
			fontptr-1);
		BEGIN
		dvibuf[dviptr]:=fontcheck[fontptr].b0;
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		BEGIN
		dvibuf[dviptr]:=fontcheck[fontptr].b1;
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		BEGIN
		dvibuf[dviptr]:=fontcheck[fontptr].b2;
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		BEGIN
		dvibuf[dviptr]:=fontcheck[fontptr].b3;
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		dvifour(fontsize[fontptr]);
		dvifour(fontdsize[fontptr]);
		BEGIN
		dvibuf[dviptr]:=(strstart[fontarea[fontptr]+1]-strstart[fontarea[
										 fontptr]]);
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		BEGIN
		dvibuf[dviptr]:=(strstart[fontname[fontptr]+1]-strstart[fontname[
										 fontptr]]);
		dviptr:=dviptr+1;
		IF dviptr=dvilimit THEN
		    dviswap;
		END;
		{556}
		FOR k:=strstart[fontarea[fontptr]]TO strstart[fontarea[fontptr]+1]
		-1 DO
		    BEGIN
		    dvibuf[dviptr]:=strpool[k];
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			dviswap;
		    END;
		FOR k:=strstart[fontname[fontptr]]TO strstart[fontname[fontptr]+1]-1 DO
		    BEGIN
		    dvibuf[dviptr]:=strpool[k];
		    dviptr:=dviptr+1;
		    IF dviptr=dvilimit THEN
			dviswap;
		    END;
		END;
	    fontptr:=fontptr-1;
	    END;
	dvifour(-1);
	dvifour(lastbop);
	BEGIN
	dvibuf[dviptr]:=2;
	dviptr:=dviptr+1;
	IF dviptr=dvilimit THEN
	    dviswap;
	END;
	k:=4+((dvibufsize-dviptr)MOD 4);
	WHILE k>0 DO
	    BEGIN
	    BEGIN
	    dvibuf[dviptr]:=223;
	    dviptr:=dviptr+1;
	    IF dviptr=dvilimit THEN
		dviswap;
	    END;
	    k:=k-1;
	    END;
	{515}
	IF dvilimit=halfbuf THEN
	    writedvi(halfbuf,dvibufsize-1);
	IF dviptr>0 THEN
	    writedvi(0,dviptr-1);
	printnl(592);
	print(outputfilena);
	print(153);
	printint(totalpages);
	print(593);
	printint(dvioffset+dviptr);
	print(594);
	bclose(dvifile);
	IF pseudotypein=0 THEN
	    BEGIN
	    k:=selector;
	    selector:=21;
	    print(595);
	    print(outputfilena);
	    selector:=k;
	    BEGIN
	    IF poolptr+1>poolsize THEN
		overflow(129,poolsize);
	    END;
	    pseudotypein:=makestring;
	    END;
	END;
    IF jobname>0 THEN
	BEGIN
	Writeln(logfile);
	aclose(logfile);
	END;
    IF(pseudotypein<>0)AND(interaction>0)THEN
	BEGIN
	FOR k:=strstart[
	pseudotypein]TO strstart[pseudotypein+1]-1 DO ptldch(xchr[strpool[k]]);
	ptldbk(137);
	ptldln;
	END;
    END;

{1214}PROCEDURE Finalcleanup;
    LABEL
	10;
    VAR
	c:smallnumber;
	k:smallnumber;
	t:integer;
    BEGIN
    c:=curchr;
    IF jobname=0 THEN
	openlogfile;
    IF curlevel>1 THEN
	BEGIN
	printnl(1047);
	printint(curlevel-1);
	printchar(41);
	END;
    IF c=1 THEN
	BEGIN
	Storefmtfile;
	GOTO 10;
	printnl(1048);
	END;
    10:
    END;
    {1215}
PROCEDURE Initprim;
    BEGIN
    nonewcontrol:=false;
    {218}primitive(238,73,0);
    primitive(239,73,1);
    primitive(240,73,2);
    primitive(241,73,3);
    primitive(242,73,4);
    primitive(243,73,5);
    primitive(244,73,6);
    primitive(245,73,7);
    primitive(246,73,8);
    primitive(247,73,9);
    primitive(248,73,10);
    primitive(249,73,11);
    primitive(250,73,12);
    primitive(251,73,13);
    primitive(252,73,14);
    primitive(253,73,15);
    primitive(254,73,16);
    {221}primitive(256,70,2636);
    primitive(257,70,2637);
    {226}primitive(258,71,0);
    primitive(259,71,1);
    primitive(260,71,2);
    primitive(261,71,3);
    primitive(262,71,4);
    primitive(263,71,5);
    primitive(264,71,6);
    primitive(265,71,7);
    primitive(266,71,8);
    primitive(267,71,9);
    primitive(268,71,10);
    primitive(269,71,11);
    primitive(270,71,12);
    primitive(271,71,13);
    primitive(272,71,14);
    primitive(273,71,15);
    primitive(274,71,16);
    primitive(275,71,17);
    primitive(276,71,18);
    primitive(277,71,19);
    primitive(278,71,20);
    primitive(279,71,21);
    primitive(280,71,22);
    primitive(281,71,23);
    primitive(282,71,24);
    primitive(283,71,25);
    primitive(284,71,26);
    primitive(285,71,27);
    primitive(286,71,28);
    primitive(287,71,29);
    primitive(288,71,30);
    primitive(289,71,31);
    primitive(290,71,32);
    primitive(291,71,33);
    primitive(292,71,34);
    primitive(293,71,35);
    primitive(294,71,36);
    primitive(295,71,37);
    {233}primitive(297,72,0);
    primitive(298,72,1);
    primitive(299,72,2);
    primitive(300,72,3);
    primitive(301,72,4);
    primitive(302,72,5);
    primitive(303,72,6);
    primitive(304,72,7);
    primitive(305,72,8);
    primitive(306,72,9);
    primitive(307,72,10);
    primitive(308,72,11);
    primitive(309,72,12);
    primitive(310,72,13);
    primitive(311,72,14);
    primitive(312,72,15);
    primitive(313,72,16);
    {248}primitive(319,0,0);
    primitive(320,81,0);
    primitive(321,16,0);
    primitive(322,17,0);
    primitive(215,18,0);
    primitive(323,19,0);
    primitive(324,40,0);
    primitive(325,83,0);
    primitive(58,78,0);
    primitive(326,79,0);
    primitive(327,65,0);
    primitive(328,88,0);
    primitive(329,24,0);
    primitive(330,25,0);
    primitive(331,68,0);
    primitive(332,32,0);
    primitive(333,33,0);
    primitive(334,34,0);
    primitive(335,35,0);
    primitive(336,36,0);
    primitive(198,37,0);
    primitive(216,38,0);
    primitive(337,39,0);
    primitive(338,89,0);
    primitive(47,42,0);
    primitive(339,43,0);
    primitive(340,44,0);
    primitive(341,74,0);
    primitive(342,15,0);
    primitive(343,49,0);
    primitive(201,52,0);
    primitive(344,53,0);
    primitive(345,56,0);
    primitive(346,57,0);
    primitive(347,62,0);
    primitive(348,60,0);
    primitive(349,61,0);
    primitive(32,63,0);
    primitive(350,64,0);
    {312}primitive(397,13,0);
    parloc:=curval;
    partoken:=4096+parloc;
    {346}primitive(426,93,0);
    primitive(427,93,1);
    primitive(428,93,2);
    primitive(429,93,3);
    primitive(430,93,4);
    {373}primitive(458,67,0);
    primitive(459,67,1);
    primitive(460,67,2);
    primitive(461,75,17);
    primitive(462,66,0);
    primitive(463,66,1);
    {378}primitive(466,69,93);
    primitive(467,69,1);
    {680}primitive(368,4,128);
    primitive(370,5,129);
    hash[2357].rh:=370;
    eqtb[2357]:=eqtb[curval];
    {938}primitive(750,14,0);
    primitive(751,14,1);
    {946}primitive(753,26,4);
    primitive(754,26,0);
    primitive(755,26,1);
    primitive(756,26,2);
    primitive(757,26,3);
    primitive(758,27,4);
    primitive(759,27,0);
    primitive(760,27,1);
    primitive(761,27,2);
    primitive(762,27,3);
    primitive(202,28,5);
    primitive(205,29,0);
    primitive(206,30,99);
    {959}primitive(783,22,1);
    primitive(784,22,0);
    primitive(785,23,1);
    primitive(786,23,0);
    primitive(787,21,0);
    primitive(788,21,1);
    primitive(789,21,2);
    primitive(790,21,3);
    primitive(791,21,4);
    primitive(792,21,5);
    primitive(793,21,97);
    primitive(794,31,99);
    primitive(795,31,100);
    primitive(796,31,101);
    primitive(797,31,102);
    {977}primitive(811,41,1);
    primitive(812,41,0);
    {1003}primitive(45,45,1);
    primitive(213,45,0);
    {1031}primitive(858,46,0);
    primitive(859,46,1);
    {1045}primitive(619,48,15);
    primitive(620,48,16);
    primitive(621,48,17);
    primitive(622,48,18);
    primitive(623,48,19);
    primitive(624,48,20);
    primitive(625,48,21);
    primitive(628,48,25);
    primitive(627,48,26);
    {1057}primitive(614,51,0);
    primitive(615,51,2);
    primitive(616,51,4);
    primitive(617,51,6);
    {1064}primitive(876,50,0);
    primitive(877,50,1);
    primitive(878,50,2);
    primitive(631,50,3);
    primitive(879,50,4);
    primitive(880,50,5);
    {1073}primitive(629,47,29);
    primitive(630,47,30);
    {1093}primitive(892,55,0);
    primitive(893,55,1);
    primitive(894,55,2);
    primitive(895,55,3);
    primitive(896,55,4);
    primitive(897,55,5);
    primitive(898,55,6);
    primitive(899,55,7);
    primitive(900,55,8);
    primitive(901,55,9);
    {1110}primitive(920,80,1);
    primitive(921,80,2);
    primitive(922,80,4);
    primitive(923,82,0);
    primitive(924,82,1);
    primitive(925,82,2);
    primitive(926,82,3);
    {1125}primitive(942,76,2944);
    primitive(943,76,3072);
    primitive(944,76,3200);
    primitive(945,76,3328);
    primitive(946,76,3456);
    primitive(947,76,3878);
    primitive(636,77,2895);
    primitive(637,77,2911);
    primitive(638,77,2927);
    {1130}primitive(955,84,0);
    primitive(956,84,1);
    primitive(957,84,2);
    primitive(958,85,0);
    primitive(959,85,1);
    primitive(960,85,2);
    primitive(961,86,0);
    primitive(962,86,1);
    primitive(963,86,2);
    primitive(964,87,0);
    primitive(965,87,1);
    primitive(966,87,2);
    {1141}primitive(978,90,0);
    primitive(979,90,1);
    {1151}primitive(989,91,0);
    primitive(990,91,1);
    primitive(991,91,2);
    primitive(992,91,3);
    {1157}primitive(993,58,0);
    primitive(994,58,1);
    {1165}primitive(1000,54,3200);
    primitive(1001,54,3328);
    {1170}primitive(1002,20,0);
    primitive(1003,20,1);
    primitive(1004,20,2);
    primitive(1005,20,3);
    {1223}primitive(1049,59,0);
    primitive(1050,59,1);
    sendloc:=curval;
    primitive(1051,59,2);
    primitive(1052,59,3);;
    nonewcontrol:=true;
    END;

{1217}PROCEDURE Debughelp;
    LABEL
	889,888,10;
    VAR
	k,l,m,n:integer;
    BEGIN
    GOTO 889;
    888:{'*************breakpoint*************';
    '***********for**debugging***********'};
    889:
    WHILE true DO
	BEGIN
	printnl(35);
	Break(termout);
	Read(termin,m);
	IF m<0 THEN
	    GOTO 10;
	IF m=0 THEN
	    GOTO 888;
	Read(termin,n);
	CASE m OF
	    {1218}1:printmemoryw(mem[n]);
	    2:printint(mem[n].hh.lh);
	    3:printint(mem[n].hh.rh);
	    4:printmemoryw(eqtb[n]);
	    5:printmemoryw(fontinfo[n]);
	    6:printmemoryw(savestack[n]);
	    7:showbox(n);
	    8:BEGIN
		breadthmax:=10000;
		depththresho:=poolsize-poolptr-10;
		shownodelist(n);
		END;
	    9:showtokenlis(n,0,1000);
	    10:print(n);
	    11:checkmem(n>0);
	    12:searchmem(n);
	    13:BEGIN
		Read(termin,l);
		printcmdchr(n,l);
		END;
	    14:
		FOR k:=0 TO n DO print(buffer[k]);
	    15:BEGIN
		fontinshortd:=0;
		shortdisplay(n);
		END;
	    OTHERS:print(63)
	    END;
	END;
    10:
    END;
    {1211}
BEGIN
Rewrite(termout,'TTY:','/O');
IF readyalready=314159 THEN
    GOTO 1;
initialize;
{14}bad:=0;
IF(halferrorlin<30)OR(halferrorlin>errorline-15)THEN
    bad:=1;
IF maxprintline<60 THEN
    bad:=2;
IF dvibufsize MOD 8<>0 THEN
    bad:=3;
IF(10000<100)OR(10100>memmax)THEN
    bad:=4;
IF 1777>2100 THEN
    bad:=5;
{106}
IF(0>0)OR(255<127)THEN
    bad:=11;
IF(0>0)OR(65535<32767)THEN
    bad:=12;
IF(0<0)OR(255>65535)THEN
    bad:=13;
IF(0<0)OR(memmax>=65535)THEN
    bad:=14;
IF(0<0)OR(fontmax>255)THEN
    bad:=15;
IF(savesize>65535)OR(maxstrings>65535)THEN
    bad:=16;
IF(bufsize>65535)THEN
    bad:=17;
{271}
IF 6457>65535 THEN
    bad:=21;
{441}
IF 18>filenamesize THEN
    bad:=31;
{1140}
IF 2*65535<10000 THEN
    bad:=41;
IF bad>0 THEN
    BEGIN
    Write(termout,
	  'Ouch---my internal constants have been clobbered!');
    Write(termout,'---case ',bad:0);
    GOTO 9999;
    END;
IF NOT initstrings THEN
    GOTO 9999;
Initprim;
1:{55}
selector:=17;
tally:=0;
termoffset:=0;
fileoffset:=0;
{59}Write(termout,'This is TeX, Version -0.18S');
IF formatident=0 THEN
    Writeln(termout,' (no format preloaded)')
ELSE
    BEGIN
    print(formatident);
    println;
    END;
{448}jobname:=0;
{453}outputfilena:=0;;
{1216}
BEGIN{309}
BEGIN
inputptr:=0;
maxinstack:=0;
inopen:=0;
maxbufstack:=0;
paramptr:=0;
maxparamstac:=0;
scannerstatu:=0;
First:=0;
curinput.statefield:=33;
curinput.startfield:=0;
curinput.indexfield:=0;
line:=0;
curinput.namefield:=0;
alignstate:=1000000;
IF NOT initterminal THEN
    GOTO 9999;
curinput.limitfield:=Last;
First:=Last+1;
END;
IF(formatident=0)OR(buffer[curinput.locfield]=33)THEN
    BEGIN
    IF NOT
    Openfmtfile THEN
	GOTO 9999;
    IF NOT Loadfmtfile THEN
	GOTO 9999;
    WHILE(curinput.locfield<curinput.limitfield)AND(buffer[curinput.locfield
    ]=32)DO curinput.locfield:=curinput.locfield+1;
    END;
buffer[curinput.limitfield]:=13;
fixdateandti;
{665}magicoffset:=strstart[647]-9*15;
{72}
IF interaction=0 THEN
    selector:=16
ELSE
    selector:=17;
IF(curinput.locfield<curinput.limitfield)AND(eqtb[2944+buffer[curinput.
							      locfield]].hh.rh<>0)THEN
    startinput;
END;
Maincontrol;
Finalcleanup;
9998:
Closefilesan;
9999:
readyalready:=0;
END.